iOS 11九月份就要正式发布了。拖延症表示陆陆续续还没看完WWDC~💊。除了重磅的ARKit和Core ML,其他更像是小修小补。连Swift 4
都不是一门新语言,算什么WWDC~~~
陆陆续续上一些iOS 11的玩意儿吧~
Access Control
想给Swift跪了~~~
Swift么有Objective-C的.h和.m这样泾渭分明,哪些该露点的,哪些不该露点的,都很清晰。于是在Swift中有了access control,就是public啊,private啊,fileprivate啊等。
Swift 4中,主要是对private进行重新定义。在Swift 3中,private表明的属性和方法,是无法在extension中使用的,只有fileprivate才可以。但是~~~,Swift 4觉得不太合理,所以,private可以在extension中使用了~~~还是上个🌰吧。。
|
|
dynamic
Swift 3中dynamic是自带@objc,但是Swift 4中,dynamic不在包含@objc了。所以有些需要使用到@objc标明的方法,在Swift 4得补回去。之前为了让Swift可以使用JSPatch,于是乎,给一些方法都加了dynamic~~~~累cry~~
Swift & Objective-C
直接上个🌰。
|
|
Swift 3中,如果是在Objective-C中使用上述的代码,那么是可以成功调用到foo.a和[foo testA]的。在对应的xxx-Swift.h文件中,也可以看到相关的转换成Objective-C的代码。但是!!!在Swift 4,这些都不成立了。如果要使用,那么需要标上@objcMembers或者@objc。也就是——
|
|
不过,文档更推荐使用@objcMembers。据悉,@objc相对于@objcMembers而来,可能会增大包的编译大小。而且,最好是在需要使用到的地方才用上@objcMembers,而不是所有都标明~~
NSAttributedString
先前,诸如类似NSFontAttributeName,NSForegroundColorAttributeName等这些,在Swift 4中,统统变成NSAttributedStringKey.font,NSAttributedStringKey.foregroundColor等这些更佳Swift化的形式了。
String
字符串长度
| Swift 3 | Swift 4 |
|---|---|
| “xxx”.characters.count | “xxx”.count |
换行
|
|
split
这方法是进行切割字符串的。看🌰!
|
|
但是切割得到的数组是[SubString]。因此,在赋值的时候,需要对其进行强转,即String(SubString)这样。
Codable
Swift 4中,加入了Codable协议,可以将JSON给转换成对应的Struct或者Class,也可以将其他的格式转成对应的。
Codabel是由Decodable和Encodable两个协议组成的。
public typealias Codable = Decodable & Encodable
直接上🌰。
|
|
使用上,并不困难。使用JSONDecoder可以对一些时间格式进行处理,比如上述🌰就是自定义时间格式。当然还可以用时间戳显示等。dateDecodingStrategy属性是一个DateDecodingStrategy枚举值来着。具体瞅文档吧。
可以解码,当然也可以进行编码。
|
|
有了Codable,对JSON格式的转换也是方便很多。不过实际在项目中使用还是有待验证吧。不过这倒是解决了之前Swift原生代码对JSON数据的解析,不用各种嵌套。反正,使用这个协议还可以支持其他数据格式,并不是单单JSON一种。
KVC
|
|
较之Swift 3的#keyPath(T.property)这种方式,Swift 4用一个\去表示一个keyPath,而且具备各种推断,并且还可以用于struct。Swift是一门强类型的安全语言,所以使用改版后的KeyPath可以推断到原来的类型,而不是再是Any。不过,先前用#keyPath这种生成字符串的方式,居然没有被废除~😂
KeyPath的基类是AnyPath。AnyPath拥有rootType和valueType。根据上述的🌰,那么key的类型其实应该是KeyPath<Foo, Int>。也就是,如果你要取到Foo.age,其实也可以这样去写——
|
|
但是很多时候,我们会选择使用推导类型,所以还是懒一些吧。
其实按照文档来说,KeyPath的层级式这样的。
| 类 | 说明 |
|---|---|
| AnyPath | 基类,用Root和Value属性,以及appending(path: AnyKeyPath)可以进行拼接keyPath |
| PartialKeyPath |
继承自AnyPath,只声明了Root类型,Value 均为Any |
| KeyPath |
继承自PartialKeyPath,携带了Root和Value,都有明确的类型 |
| WritableKeyPath |
继承自KeyPath,可读可写,用于struct这种值类型。 |
| ReferenceWritableKeyPath |
继承自WritableKeyPath,可读可写,用于class这种引用类型。 |
另外,发现一个bug。当用KeyPath去更改struct里面的值时,只能读,不能写。但是WWDC的keynote显示又是可读可写。。寂寞。不知道是不是Debug版本的锅。反正我用的是Xcode 9 beta 6。
上个WWDC上面的那个🌰。
|
|
KVO
当需要监听对象某个属性的时候,通常我们会使用KVO的方式,利用addObserver来添加观察者,之后在
func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?)
进行处理。但是,Swift 4有了更加简单的观察形式。
|
|