使用Playground快速練習Swift語法--閉包和枚舉

閉包

定義:閉包是自包含的函數代碼塊,能夠在代碼中被傳遞和使用。html

閉包表達式語法

{ (parameters) -> returnType in 
   statements
}

Swift閉包使用{}包含,in語句前面定義好傳入函數的參數個數,類型和返回值,
in語句後面編寫實際函數體內容。ios

閉包使用例子

let names = ["張三", "李四", "王五"]
var reversed = names.sort({ (s1: String, s2: String) -> Bool in
    return s1 > s2
})
print(reversed)

閉包類型自動推斷

Swift中能夠根據上下文自動推斷閉包的參數和返回值, Swift2.0中return均可以省略。git

reversed = names.sort( { s1, s2 in s1 > s2 } )
print(reversed)

還有更簡化的,使用參數名縮寫,Swift中使用$0,$1表明第一和第二個參數編程

reversed = names.sort( { $0 > $1 } )
print(reversed)

是否是已經很簡化了,Swift還有更變態的,利用運算符函數swift

reversed = names.sort(>)
print(reversed)

String類型實現大於號(>)的運算符函數,其參數和返回值就是與咱們sort函數要求的一致,
因此能夠直接傳入運算符函數。微信

有點相似於C++中的運算符重載閉包

尾隨閉包

爲了增長代碼的可讀性,咱們可使用閉包的另外一種寫法,即尾隨閉包:app

reversed = names.sort() { $0 > $1 } 
print(reversed)

使用尾隨閉包時,閉包必須是函數的最後一個參數。
若是函數只須要一個閉包做爲參數,咱們還能夠省略()函數

reversed = names.sort{ $0 > $1 } 
print(reversed)

Swift官方的一個尾隨閉包例子ui

let digitNames = [
    0: "Zero", 1: "One", 2: "Two",   3: "Three", 4: "Four",
    5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"
]
let numbers = [16, 58, 510]

let strings = numbers.map {
    (var number) -> String in
    var output = ""
    while number > 0 {
        output = digitNames[number % 10]! + output
        number /= 10
    }
    return output
}
print(strings)

注意: 字典digitNames下標後跟着一個歎號 (!),由於字典下標返回一個可選值 (optional value),使用歎號 (!)會強制解析字典中的值,若是給一個不存在的下標(好比11),該語句就會出錯。

枚舉

枚舉基本使用

enum 方向 {
    case 東
    case 南
    case 西
    case 北
}
var directionToHead = 方向.北
//或
directionToHead = .東

Switch語句使用枚舉

direction = .南
switch direction {
case .東:
    print("龍爲東方之神")
case .南:
    print("朱雀爲南方之神")
case .西:
    print("白虎爲西方之神")
case .北:
    print("玄武爲北方之神")
}

實際編程中儘可能仍是不要用中文做爲枚舉名吧 :)

枚舉相關值

Swift中的枚舉的確強大,歷來沒見過其餘語言枚舉還有設置相關值的

enum Barcode {
    case UPCA(Int, Int, Int)
    case QRCode(String)
}
var productBarcode = Barcode.UPCA(8, 85909_51226, 3)
productBarcode = .QRCode("ABCDEFGHIJKLMNOP")

UPCA類型須要3個Int值建立,QRCode類型須要一個String類型建立

枚舉默認值

枚舉初始化的時候能夠給每一個枚舉值設置一個默認值,默認值必須具備相同的類型
如下定義一個默認值爲Character

enum ASCIIControlCharacter: Character {
    case Tab = "\t"
    case LineFeed = "\n"
    case CarriageReturn = "\r"
}

若是使用整數做爲默認值時,指定第一個後,後續的會自動遞增

enum Planet: Int {
    case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}
let earthsOrder = Planet.Earth.rawValue
let possiblePlanet = Planet(rawValue: 7)

使用枚舉的rawValue屬性獲取默認值;
經過參數爲rawValue構造函數建立特定默認值的枚舉。

參考資料

The Swift Programming Language 中文版
The Swift Programming Language 2.0 官方教程

本文做者: 陽春麪
原文地址:http://www.aswifter.com/2015/07/20/learn-swift-with-playground-closure...

歡迎關注個人微信公衆號,分享Android 開發,IOS開發,Swift開發和互聯網內容
微信號:APP開發者

相關文章
相關標籤/搜索