美文网首页SwiftSwift开发程序员
使用Playground快速练习Swift语法--闭包和枚举

使用Playground快速练习Swift语法--闭包和枚举

作者: 阳春面 | 来源:发表于2015-07-21 00:06 被阅读498次

    闭包

    定义:闭包是自包含的函数代码块,可以在代码中被传递和使用。

    闭包表达式语法

    { (parameters) -> returnType in 
       statements
    }
    

    Swift闭包使用{}包含,in语句前面定义好传入函数的参数个数,类型和返回值,
    in语句后面编写实际函数体内容。

    闭包使用例子

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

    闭包类型自动推断

    Swift中可以根据上下文自动推断闭包的参数和返回值, Swift2.0中return都可以省略。

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

    还有更简化的,使用参数名缩写,Swift中使用$0,$1代表第一和第二个参数

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

    是不是已经很简化了,Swift还有更变态的,利用运算符函数

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

    String类型实现大于号(>)的运算符函数,其参数和返回值就是与我们sort函数要求的一致,
    所以可以直接传入运算符函数。

    有点类似于C++中的运算符重载

    尾随闭包

    为了增加代码的可读性,我们可以使用闭包的另一种写法,即尾随闭包:

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

    使用尾随闭包时,闭包必须是函数的最后一个参数。
    如果函数只需要一个闭包作为参数,我们还可以省略()

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

    Swift官方的一个尾随闭包例子

    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-enum/

    欢迎关注我的微信公众号,分享Android 开发,IOS开发,Swift开发和互联网内容
    微信号:APP开发者

    相关文章

      网友评论

        本文标题:使用Playground快速练习Swift语法--闭包和枚举

        本文链接:https://www.haomeiwen.com/subject/bmppqttx.html