swift4切换记录
关于iOS11与swift4可以参考: 开发者所需要知道的 iOS 11 SDK 新特性 及最全的 Swift 4 新特性解析
看了一些资料后,遍找了一个项目尝试切换到swift,本文主要记录切换过程中遇到的问题。
相比与swift3,切换到swift4算是相当简单,对于我的项目而言,主要遇到两类问题:
NSAttributedString 中的常量变更为结构 NSAttributedStringKey
例如: NSForegroundColorAttributeName 变为 SAttributedStringKey.foregroundColor
swift 3:
attributeString.addAttribute(NSForegroundColorAttributeName,
value: UIColor.kRGBColorFromHex(rgbValue: 0xA4A7B2),
range: NSMakeRange(0, length))
swift 4:
attributeString.addAttribute(NSAttributedStringKey.foregroundColor,
value: UIColor.kRGBColorFromHex(rgbValue: 0xA4A7B2),
range: NSMakeRange(0, length))
继承于OC类的子类不再具有动态特性
在swift3中,如果你用 Swift 写的 class 是继承自 NSObject 的话,Swift 会默认自动为所有的非 private 的类和成员加上 @objc。
但在swift4中这个特性没有了,我们只能手动在类前面加上@objcMembers,或者在想要具有动态特性的属性或方法前加上@objc。
这可能是苹果为了继续分离swift和oc所做的修改,也就是说继承自NSObject的类也不具备动态特性,想要使用必须声明。同样继承于UIViewController也一样。
具体表现为:
使用 #selector 关键字调用的方法都必须在方法前加上@objc
例如:
let longpress = UILongPressGestureRecognizer(target: self, action: #selector(UBRemoteControlViewController.longPress(gesture:)))
self.view.addGestureRecognizer(longpress)
@objc func longPress(gesture : UILongPressGestureRecognizer) {
// do something
}
需要动态调用的属性需要加上@objc
例如想要使用NSKeyValueCoding中的方法如:
open func setValue(_ value: Any?, forKey key: String)
open func setValue(_ value: Any?, forKeyPath keyPath: String)
open func setValue(_ value: Any?, forUndefinedKey key: String)
必须要在相应的属性前加上@objc,否则会报找不到方法
如果你嫌麻烦,想要整个类都具有动态属性,可以在类前添加@objcMembers
注意:@objcMembers是swift 3.2才加入的关键字
待续。。。。。。