虽然说我使用的三方库都在第一时间将库升级到了 Swift 3 ,但是期中 Alamofire 和 Snap 两个库最低适配只支持到了 iOS 9,为了避免和产品撕逼,不得不想办法解决这个适配问题。下面以 Alamofire 为例
其实三方库么,不一定只用 Cocoapods 的。所以打算下载代码然后直接撸源码。
先Alamofire的 Xcode 修改为最低适配 8.0,然后编译查找不通过的函数,并删除。(其实这些函数都是 iOS 9 新加的函数,所以删除不影响什么。)
大概花了 半个小时左右就可以删完了,然后直接拖到项目中就可以了~
Snap 其实只要拖进去就好了,暂时不需要修改什么。
// 其实都是 !os(watchOS) 这个宏下面的 #if !os(watchOS) @discardableResult public func stream(withHostName hostName: String, port: Int) -> StreamRequest { return SessionManager.default.stream(withHostName: hostName, port: port) } @discardableResult public func stream(with netService: NetService) -> StreamRequest { return SessionManager.default.stream(with: netService) } #endif @escaping
这个是我在适配中最蛋疼的坑
首先在看swift-evolution只是了解到@escaping 必须显示声明。但是不知道@escaping的闭包,在函数体内无法再修改。
let pedonmeter:CMPedometer = CMPedometer() func getPedometerDataFromDate(_ datet:Date?, withHandler handler: @escaping (CMPedometerData?, Error?) -> ()){ // 编译错误 pedonmeter.queryPedometerDataFromDate(startTime, toDate:endTime, withHandler: { (pedometerData:CMPedometerData?, error:NSError?) -> Void in guard let pedometerData = pedometerData else { return } handler(pedometerData, error) // 做一些事情 }) // 最后逼不得已只能不修改了,函数外面就做一些事情了 pedonmeter.queryPedometerData(from: startTime, to: endTime, withHandler: handler as! CMPedometerHandler) } Result of call to \'funtion\' is unused
这其实不是一个 编译错误,但是这个警告最开始让我有点懵逼.返回值不用难道要我都修改一下?
最开始其实我是这么修改的 let _ = funtion(),但是后面在看SE-0047的时候发现@discardableResult也是可以达到这个效果的。
Date && NSDate
因为有个项目中使用的 DateTools 这个工具。它有一个 NSDate + Tools 的分类。
但是在写 Swift 3 的过程中我发现如果变量是 Date 类型的无法使用NSDate + Tools 这个类型,必须显示声明date as NSDate 这样才能调用分类的一些个方法。
这个让使用 OC 的库的时候会感觉十分不舒服,毕竟很多 NS 的前缀去掉了。所有都显示声明太不友好了。
CAAnimationDelegate
这个其实好像是 Xcode 8 的修改。因为之前CAAnimationDelegate 是一个分类。大概声明如下:
@interface NSObject (CAAnimationDelegate)- (void)animationDidStart:(CAAnimation *)anim; - - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;@end
之前是在 vc 中只要重写一下 animationDidStart 函数就可以了。但是新的不行,起初以为是 Swift 3 的变化,但是其实是 Xcode 8 中的修改。将 CAAnimationDelegate 变成了一个协议。我感觉这个修改是为了适配 Swift 3 ?变化如下:
@protocol CAAnimationDelegate @optional- (void)animationDidStart:(CAAnimation *)anim; - - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;@end因为宽度时间比较长,其他的暂时想不到了。未完待续吧...
其他
还有许多微妙的变化让你似乎看不懂这个语言了,所以建议在适配之前看一下下面的文章。
Swift 3 新特性一览
[Swift 3.0 - Released on September 13, 2016]https://github.com/apple/swift-evolution/blob/master/releases/swift-3_0.md
还有@卓同学 的 Swift 3 必看系列
还有几个不错的总结
Swift 3 by 顾 鹏
适配 Swift 3 的一点小经验和坑 by 图拉鼎
总结