Swift概覽 - 代碼速讀

1.簡(jiǎn)單值

//常量
let myConstant = 42

//變量
var myVariable = 42
myVariable = 50

//指定類型變量(不指定的話自動(dòng)判斷)
let explicitDouble: Double = 70

//類型轉(zhuǎn)換
let label = "The width is "
let width = 94
let widthLabel = label + String(width)

//字符串拼接
let apples = 3
let oranges = 5
let appleSummary = "I have \(apples) apples."
let fruitSummary = "I have \(apples + oranges) pieces of fruit."

//數(shù)組
let emptyArray = [String]() //數(shù)組初始化
var shoppingList = ["catfish", "water", "tulips", "blue paint"]
shoppingList[1] = "bottle of water" //指定元素修改

//字典
let emptyDictionary = [String: Float]() //字典初始化
var occupations = [
    "Malcolm": "Captain",
    "Kaylee": "Mechanic",
]
occupations["Jayne"] = "Public Relations" //指定元素修改

2.控制流

//for循環(huán)遍歷數(shù)組
let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
    if score > 50 {
        teamScore += 3
    } else {
        teamScore += 1
    }
}
print(teamScore)

//for循環(huán)遍歷字典
let interestingNumbers = [
    "Prime": [2, 3, 5, 7, 11, 13],
    "Fibonacci": [1, 1, 2, 3, 5, 8],
    "Square": [1, 4, 9, 16, 25],
]
var largest = 0
for (kind, numbers) in interestingNumbers {
    for number in numbers {
        if number > largest {
            largest = number
        }
    }
}
print(largest)
//..<來(lái)創(chuàng)建一個(gè)不包含最大值的區(qū)間炊琉,使用 ... 來(lái)創(chuàng)造一個(gè)包含最大值和最小值的區(qū)間
var total = 0
for i in 0..<4 {
    total += i
}
print(total)

//問(wèn)號(hào)表示可選
var optionalString: String? = "Hello"
print(optionalString == nil)

//if判斷
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
    greeting = "Hello, \(name)"
}

//雙問(wèn)號(hào)判斷是否nil
let nickName: String? = nil
let fullName: String = "John Appleseed"
let informalGreeting = "Hi \(nickName ?? fullName)"

//switch控制(default必須有)
let vegetable = "red pepper"
switch vegetable {
case "celery":
    print("Add some raisins and make ants on a log.")
case "cucumber", "watercress":
    print("That would make a good tea sandwich.")
case let x where x.hasSuffix("pepper"):
    print("Is it a spicy \(x)?")
default:
    print("Everything tastes good in soup.")
}

//while循環(huán)(條件在前)
var n = 2
while n < 100 {
    n = n * 2
}
print(n)

//while循環(huán)(條件在后)
var m = 2
repeat {
    m = m * 2
} while m < 100
print(m)

3.函數(shù)和閉包

//函數(shù)
//person: String, day: String表示參數(shù),-> String表示返回值
func greet(person: String, day: String) -> String {
    return "Hello \(person), today is \(day)."
}
greet(person: "Bob", day: "Tuesday")

//on表示形式參數(shù),方法調(diào)用的時(shí)候提示用的养距。如果用下劃線可以避免形式參數(shù)
func greet2(person: String, on day: String) -> String {
    return "Hello \(person), today is \(day)."
}
greet2(person: "Bob", on: "Tuesday")

//使用元組來(lái)從函數(shù)中返回多個(gè)值禾蚕。元組中的元素可以通過(guò)名字或者數(shù)字調(diào)用理茎。
func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) {
    var min = scores[0]
    var max = scores[0]
    var sum = 0
    
    for score in scores {
        if score > max {
            max = score
        } else if score < min {
            min = score
        }
        sum += score
    }
    
    return (min, max, sum)
}
let statistics = calculateStatistics(scores: [5, 3, 100, 3, 9])
print(statistics.sum)
print(statistics.2)

//函數(shù)同樣可以接受多個(gè)參數(shù)竹宋,然后把它們存放進(jìn)數(shù)組當(dāng)中熬苍。
func sumOf(numbers: Int...) -> Int {
    var sum = 0
    for number in numbers {
        sum += number
    }
    return sum
}
sumOf()
sumOf(numbers: 42, 597, 12)

//內(nèi)嵌函數(shù)
func returnFifteen() -> Int {
    var y = 10
    func add() {
        y += 5
    }
    add()
    return y
}
returnFifteen()

//把函數(shù)作為值來(lái)返回(就是說(shuō)函數(shù)的返回值是另一個(gè)函數(shù))
func makeIncrementer() -> ((Int) -> Int) {
    func addOne(number: Int) -> Int {
        return 1 + number
    }
    return addOne
}
var increment = makeIncrementer()
increment(7)

//函數(shù)作為另一個(gè)函數(shù)的參數(shù)
func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {
    for item in list {
        if condition(item) {
            return true
        }
    }
    return false
}
func lessThanTen(number: Int) -> Bool {
    return number < 10
}
var numbers = [20, 19, 7, 12]
hasAnyMatches(list: numbers, condition: lessThanTen)

//閉包
numbers.map({
    (number: Int) -> Int in
    let result = 3 * number
    return result
})

//單語(yǔ)句閉包隱式地返回語(yǔ)句執(zhí)行的結(jié)果
let mappedNumbers = numbers.map({ number in 3 * number })
print(mappedNumbers)

//如果閉包是函數(shù)的唯一參數(shù)稍走,你可以去掉圓括號(hào)直接寫閉包
let sortedNumbers = numbers.sorted { $0 > $1 }
print(sortedNumbers)

4.對(duì)象和類

//類
class Shape {
    var numberOfSides = 0
    func simpleDescription() -> String {
        return "A shape with \(numberOfSides) sides."
    }
}

//實(shí)例化類
var shape = Shape()
shape.numberOfSides = 7
var shapeDescription = shape.simpleDescription()

//init來(lái)創(chuàng)建一個(gè)初始化器
//使用 deinit來(lái)創(chuàng)建一個(gè)反初始化器,如果你需要在釋放對(duì)象之前執(zhí)行一些清理工作的話
class NamedShape {
    var numberOfSides: Int = 0
    var name: String
    
    init(name: String) {
        self.name = name
    }
    
    func simpleDescription() -> String {
        return "A shape with \(numberOfSides) sides."
    }
}

//類的繼承和方法重寫
class Square: NamedShape {
    var sideLength: Double
    
    init(sideLength: Double, name: String) {
        self.sideLength = sideLength
        super.init(name: name)
        numberOfSides = 4
    }
    
    func area() ->  Double {
        return sideLength * sideLength
    }
    
    override func simpleDescription() -> String {
        return "A square with sides of length \(sideLength)."
    }
}
let test = Square(sideLength: 5.2, name: "my test square")
test.area()
test.simpleDescription()

//帶有g(shù)etter和setter的計(jì)算屬性
class EquilateralTriangle: NamedShape {
    var sideLength: Double = 0.0
    
    init(sideLength: Double, name: String) {
        self.sideLength = sideLength
        super.init(name: name)
        numberOfSides = 3
    }
    
    var perimeter: Double {
        get {
            return 3.0 * sideLength
        }
        set {
            sideLength = newValue / 3.0
        }
    }
    
    override func simpleDescription() -> String {
        return "An equilateral triangle with sides of length \(sideLength)."
    }
}
var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
print(triangle.perimeter)
triangle.perimeter = 9.9
print(triangle.sideLength)

//willSet和didSet
class TriangleAndSquare {
    var triangle: EquilateralTriangle {
        willSet {
            square.sideLength = newValue.sideLength
        }
    }
    var square: Square {
        willSet {
            triangle.sideLength = newValue.sideLength
        }
    }
    init(size: Double, name: String) {
        square = Square(sideLength: size, name: name)
        triangle = EquilateralTriangle(sideLength: size, name: name)
    }
}
var triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape")
print(triangleAndSquare.square.sideLength)
print(triangleAndSquare.triangle.sideLength)
triangleAndSquare.square = Square(sideLength: 50, name: "larger square")
print(triangleAndSquare.triangle.sideLength)

5.枚舉和結(jié)構(gòu)體

//枚舉
enum Rank: Int {
    case ace = 1
    case two, three, four, five, six, seven, eight, nine, ten
    case jack, queen, king
    func simpleDescription() -> String {
        switch self {
        case .ace:
            return "ace"
        case .jack:
            return "jack"
        case .queen:
            return "queen"
        case .king:
            return "king"
        default:
            return String(self.rawValue)
        }
    }
}
let ace = Rank.ace
let aceRawValue = ace.rawValue

//枚舉成員的值是實(shí)際的值,不是原始值的另一種寫法
enum Suit {
    case spades, hearts, diamonds, clubs
    func simpleDescription() -> String {
        switch self {
        case .spades:
            return "spades"
        case .hearts:
            return "hearts"
        case .diamonds:
            return "diamonds"
        case .clubs:
            return "clubs"
        }
    }
}
let hearts = Suit.hearts
let heartsDescription = hearts.simpleDescription()

//結(jié)構(gòu)體(結(jié)構(gòu)體傳值婿脸,類傳遞引用)
struct Card {
    var rank: Rank
    var suit: Suit
    func simpleDescription() -> String {
        return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
    }
}
let threeOfSpades = Card(rank: .three, suit: .spades)
let threeOfSpadesDescription = threeOfSpades.simpleDescription()

6.協(xié)議和擴(kuò)展

//聲明一個(gè)協(xié)議
protocol ExampleProtocol {
    var simpleDescription: String { get }
    mutating func adjust()
}

//類和結(jié)構(gòu)體粱胜,都可以繼承自同一個(gè)協(xié)議
class SimpleClass: ExampleProtocol {
    var simpleDescription: String = "A very simple class."
    var anotherProperty: Int = 69105
    func adjust() {
        simpleDescription += "  Now 100% adjusted."
    }
}
var a = SimpleClass()
a.adjust()
let aDescription = a.simpleDescription

struct SimpleStructure: ExampleProtocol {
    var simpleDescription: String = "A simple structure"
    mutating func adjust() {
        simpleDescription += " (adjusted)"
    }
}
var b = SimpleStructure()
b.adjust()
let bDescription = b.simpleDescription

//類的方法可以修改類的屬性,但是結(jié)構(gòu)體的方法盖淡,無(wú)法修改自身的屬性年柠。如果要修改,需要在方法前加 mutating
extension Int: ExampleProtocol {
    var simpleDescription: String {
        return "The number \(self)"
    }
    mutating func adjust() {
        self += 42
    }
}
print(7.simpleDescription)

7.錯(cuò)誤處理

enum PrinterError: Error {
    case outOfPaper
    case noToner
    case onFire
}
//使用 throw 來(lái)拋出一個(gè)錯(cuò)誤
func send(job: Int, toPrinter printerName: String) throws -> String {
    if printerName == "Never Has Toner" {
        throw PrinterError.noToner
    }
    return "Job sent"
}

//使用do-catch處理錯(cuò)誤
do {
    let printerResponse = try send(job: 1040, toPrinter: "Bi Sheng")
    print(printerResponse)
} catch {
    print(error)
}

//提供多個(gè)catch代碼塊來(lái)處理特定的錯(cuò)誤
do {
    let printerResponse = try send(job: 1440, toPrinter: "Gutenberg")
    print(printerResponse)
} catch PrinterError.onFire {
    print("I'll just put this over here, with the rest of the fire.")
} catch let printerError as PrinterError {
    print("Printer error: \(printerError).")
} catch {
    print(error)
}

//使用try處理錯(cuò)誤
let printerSuccess = try? send(job: 1884, toPrinter: "Mergenthaler")
let printerFailure = try? send(job: 1885, toPrinter: "Never Has Toner")

//使用 defer 來(lái)寫在函數(shù)返回后也會(huì)被執(zhí)行的代碼塊
var fridgeIsOpen = false
let fridgeContent = ["milk", "eggs", "leftovers"]
func fridgeContains(_ food: String) -> Bool {
    fridgeIsOpen = true
    defer {
        fridgeIsOpen = false
    }
    
    let result = fridgeContent.contains(food)
    return result
}
fridgeContains("banana")
print(fridgeIsOpen)

8.泛型

//把名字寫在尖括號(hào)里來(lái)創(chuàng)建一個(gè)泛型方法或者類型
func makeArray<Item>(repeating item: Item, numberOfTimes: Int) -> [Item] {
    var result = [Item]()
    for _ in 0..<numberOfTimes {
        result.append(item)
    }
    return result
}
makeArray(repeating: "knock", numberOfTimes:4)

//你可以從函數(shù)和方法同時(shí)還有類褪迟,枚舉以及結(jié)構(gòu)體創(chuàng)建泛型
enum OptionalValue<Wrapped> {
    case none
    case some(Wrapped)
}
var possibleInteger: OptionalValue<Int> = .none
possibleInteger = .some(100)

//在類型名稱后緊接 where來(lái)明確一系列需求——比如說(shuō)冗恨,來(lái)要求類型實(shí)現(xiàn)一個(gè)協(xié)議,要求兩個(gè)類型必須相同味赃,或者要求類必須繼承自特定的父類
func anyCommonElements<T: Sequence, U: Sequence>(_ lhs: T, _ rhs: U) -> Bool
    where T.Iterator.Element: Equatable, T.Iterator.Element == U.Iterator.Element {
        for lhsItem in lhs {
            for rhsItem in rhs {
                if lhsItem == rhsItem {
                    return true
                }
            }
        }
        return false
}
anyCommonElements([1, 2, 3], [3])
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掀抹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子心俗,更是在濱河造成了極大的恐慌傲武,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件城榛,死亡現(xiàn)場(chǎng)離奇詭異揪利,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)狠持,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門疟位,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人喘垂,你說(shuō)我怎么就攤上這事甜刻。” “怎么了正勒?”我有些...
    開(kāi)封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵得院,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我章贞,道長(zhǎng)祥绞,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任鸭限,我火速辦了婚禮就谜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘里覆。我一直安慰自己,他們只是感情好缆瓣,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布喧枷。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪隧甚。 梳的紋絲不亂的頭發(fā)上车荔,一...
    開(kāi)封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音戚扳,去河邊找鬼忧便。 笑死,一個(gè)胖子當(dāng)著我的面吹牛帽借,可吹牛的內(nèi)容都是我干的珠增。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼砍艾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蒂教!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起脆荷,我...
    開(kāi)封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤凝垛,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后蜓谋,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體梦皮,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年桃焕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了剑肯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡覆旭,死狀恐怖退子,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情型将,我是刑警寧澤寂祥,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站七兜,受9級(jí)特大地震影響丸凭,放射性物質(zhì)發(fā)生泄漏牡借。R本人自食惡果不足惜撞叨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望马昨。 院中可真熱鬧狠裹,春花似錦虽界、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)撇吞。三九已至,卻和暖如春礁叔,著一層夾襖步出監(jiān)牢的瞬間牍颈,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工琅关, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留煮岁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓涣易,卻偏偏與公主長(zhǎng)得像画机,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子都毒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361