美文网首页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