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
有了更加简单的观察形式。
|
|