Martin

思想空间

我是Martin,iOS / Android 开发者。


欢迎来到我的思想空间

swift4切换记录

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才加入的关键字

待续。。。。。。

最近的文章

Blockly在iOS上的实践

Blockly在iOS上的实践好久没写东西了,惭愧身在一个机器人公司,才知道Blockly,惭愧什么是Blockly?Blockly是一个用于Web、Android、IOS的可视化代码编辑器库。Blockly使用了相互关联的积木来表示表达代码中变量、逻辑表达式、循环等。它让用户能够了解编程,而不用面对命令行上让人恐惧和枯燥的代码和语法。官方地址:overview iosgithup大概的形式是这样的:个人理解:Blockly是一套编程语言,我们可以通过拖拽的方式组织逻辑,...…

总结知识管理继续阅读
更早的文章

WebRTCDemo

WebRTCDemo最近公司有需求做局域网视频通讯,于是调研了webrtc并实现一个简单demo,本文主要记录demo的实现逻辑,以便以后使用时尽快上手。本文主要参考 :iOS下音视频通信-基于WebRTCiOS下WebRTC音视频通话(二)-局域网内音视频通话一些基本概念这里不讲,关于什么是ice,sdp参考上面的文章,直接讲思路及代码思路要建立p2p连接,我们需要:发起端A,接受端B,信令服务。这里信令服务的作用主要是在A和B建立连接前做一些信息的交换,当A和B真正建立连接后就不需要信...…

总结知识管理继续阅读