美文网首页swift程序员iOS Developer
Swift 4 新功能详解 《What's New i

Swift 4 新功能详解 《What's New i

作者: a437e8f87a81 | 来源:发表于2017-09-01 12:11 被阅读532次

    简介:

    Swift 4来袭,这次升级来说好的很多,大部分都是介于Swift 3的基础上附加的,基本语法是没有什么大的变化的.想想Swift2-Swift3的变化,那一段蛋疼的时间.Swift 4的这次更新,真的爽太多了

    Swift 4需要安装Xcode 9--->下载链接 Xcode 9同时支持Swift 3\Swift 4,你的项目中的Target可以是Swift 3.2或Swift 4,当想迁移到Swift 4时,你可以通过Edit/Convert/To Current Swift Syntax…来打开转换工具。

    新特性:

    1.开区间

     SE-0172带来 种新的RangeExpression协议和 组前缀/后缀操作符给开区间.比如现在区间论是上界还是下界都可以不指定

    Swift 3的写法----->

    Swift 3’s solution to this is a family of methods:

    let greeting = s.prefix(upTo: i)

    let withComma = s.prefix(through: i)

    let location = s.suffix(from: i)

    Swift 4的写法----->

    let greeting=s[...<i]

    let withComma=s[...i]

    letlocation=s[i...]

    2.字符串Strings的变化 

    a.SE-0168大佬带来一种种简洁定义多字符的语法,使("""),在多行字符串中并不需要写转译字符,也就是说大多数文本格式(入JSON或HTML)就可以直接粘贴而无需任何转译,结尾三引号的缩进觉定每一行的头部空格的多少,哈哈说到这个Python笑了"呵呵"Kotlin"我也早有了"

    b.SE-0163是的,Swift 4字符串模型的第一部分修正,好像艾克的大招一样回光反照了,String又变得像以前的Swift 1.x一样了,此次更改String中的.CharacterView,并在了其父类中,其他view,UnicodeScalarView, UTF8View,和UTF16View,依旧还在.

    去掉了String的characters数组,可以直接用数组的方式来遍历String对象:

    let yourString = "Hello world"

    for char in yourString{

         print(char)

    }

    c.添加新类型字符串切片是SubString类型的实例,两者都遵循StringProtocol,所以说对应API来说String和Substring行为很大程度相同

    let endIndex = sample.index(sample.startIndex ,offsetBy:3)

    var subString =  sample[sample.startIndex...endIndex]

    d.支持Unicode 9,之前,由多个代码点组成的Unicode字符引起大于1的计数,下面的字符计数都是1,前后对比

    "👩‍💻".count // Now: 1, Before: 2

    "👍🏽".count // Now: 1, Before: 2

    "👨‍❤️‍💋‍👨".count // Now: 1, Before, 4

    现在可以直接访问一个Character的unicode编码值,不用先转成String SE-0178,如下:

    For example, today you can write this:

    lets="one two three"s.split(separator:"")

    But you cannot write this:

    let ws=CharacterSet.whitespacesAndNewliness

    split{ $0.unicodeScalars.contains(where: ws.contains)  }

    4.Private访问修饰符

    SE-0169同文件内的扩展,私有声明可见,Swift 3 private成员本身私有使用,fileprivate则是在同一个文件被共享访问成员时使用,原类型的private声明也是可见的.这种改进可让同文件内保持使private分割类型定义成为可能,减少不受欢迎的fileprivate关键词的使用

    Swift 3:

    struct Outer {

         private var outerValue = 42

         struct Inner {

                private var innerValue = 57

                func innerTest(_o:  Outer)  {

                       print(o.outerValue)       //still ok.

               }   

     }func test(_i: Inner) {

             print(i.innerValue)          //still an error

      }

    }

    but Swift 4

    struct SortedArray {

         private var storage: [Element] = []init(unsorted: [Element]) {

                storage = unsorted.sorted()

         }

    }

    extension SortedArray {

         mutating func insert(_ element: Element) {

               storage    此处可见

               storage.append(element)

              storage.sort()

        }

    }

    5.key path

    class dog: NSObject {

          @objc var dogName = "阿黄"

    }

    //swift4之前

    //let dog = dog()

    //dog.dogName = "阿黄"

    //var name = dog.value(forKeyPath:  "dogName")

    //dog("老王", forKeyPath: "dogName")

    /// Swift4.0

    //let dogKeyPath = dog.season

    //var dogName = dog[keyPath: dogKeyPath]

    //dog[keyPath: dogKeyPath] = "老王"

    6.压缩化与序列化

    Swift Archival & Serialization定义  种为任意Swift类型(class, struct,和enum)来描述如何压缩和序列化的方法.类型可遵从Codable协议让自身可(解)压缩.多数情况下添加Codable协议就可以让你的自定义类型完美解压缩,因为编译器可以生成一个默认的实现,前提是所有成员类型都是Codable的.当然你可以覆盖默认方法如果需要优化自定义类型的编码.SE-0166

    7.使用泛型下标操作符

    SE-0148,下标现在可以有泛型参数和返回类型

    struct JSON {

    private var data: [String: Any]

    init(data: [String: Any]) {

    self.data = data

    }

    subscript(key: String) -> Any? {

    return data[key]

    }

    }

    let json = JSON(data: [

    "name": "老万",

    "age": 2

    ])

    let name: String? = json["name"] as? String  // "老万"

    let age: Int? = json["age"] as? Int          // 2


    相关文章

      网友评论

        本文标题:Swift 4 新功能详解 《What's New i

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