Swift 3 新特性和迁移详解 (2)

虽然说我使用的三方库都在第一时间将库升级到了 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 图拉鼎

总结

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyppxz.html