简介:
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
网友评论