升级 Xcode 10 适配swift 4.2

September 18, 2018   

今天提示 Xcode 10 GM 版本出来,也是等了好久,第一时间做了升级,之前装了 beta 版和正式版共存,导致项目中的 protobuf 编译出来的文件有问题,后来就卸载了。这次 Swift 小版本的升级主要优化了编译时间,swift 的编译速度实在是难以忍受..

打开项目,第一步显示将编译器版本调至 swift 4.2,感受下 Swift 大法 🌝

项目名 —> TARGETS —> Build Settings —> Swift Compiler - Language —> Swift Language Version 选择 4.2

那就先 build 一下吧

Duang! 400+ 个 errors,真酸爽,每年都可以重学一遍,这很 Swift 嘛

改动不大,这次最主要是重新明确了很多枚举的定义:

  • UITableViewCellStyle 被重命名为 UITableViewCell.CellStyleUITableViewCellEditingStyle 被重命名为 UITableViewCell.EditingStyle
  • UIEdgeInsetsMake() 被重命名为了 UIEdgeInsets(_:_:_:_:)
  • NSAttributeStringKey 被重命名为 NSAttributeString.key
  • RunLoopMode.commonModes 被重命名为了 RunLoop.Mode.common
  • NSLayoutFormatOptions 被重命名为了 NSLayoutConstraint.FormatOptions
  • UIImageResizingMode 被重命名为了 UIImage.ResizingMode
  • UIViewAutoresizing 被重命名为了 UIView.AutoresizingMask
  • UIControlState 被重命名为了 UIControl.State
  • UIViewContentMode 被重命名为了 UIView.ContentMode
  • UIButtonType 被重命名为了 UIButton.ButtonType
  • UICollectionElementKindSectionHeader 被重命名为了 UICollectionView.elementKindSectionHeader
  • 通知由原来的统一的 Notification.Name.通知名 的形式这次改到了对应具体类下面的通知,例如原来的 .UIApplicationWillEnterForeground, 通知改为了现在的 UIApplication.willEnterForegroundNotification 的形式
  • 原来的一些 OC 常量枚举,也做了修改。例如 kCAMediaTimingFunctionEaseInEaseOut 改为了 CAMediaTimingFunctionName.easeInEaseOut

另外 Swift 对部分方法做了语义上的调整,例如原来的 bringSubview(toFront:) 方法被调整为了 bringSubviewToFront() 在一个方法明上如此反复推敲,可以说很严谨了。

枚举默认增加了可选类型,控制器原来的 ChildViewControllers 被重命名为了 children ,慢慢 Swift 和 OC 的差异越来越明显了。

语法上的改动基本就这些。

编译时会报一个 libstdc++6.0.9 的动态库找不到,这是因为苹果在最新的 Xcode 不在支持这个动态库,解决办法有两种,要么修改依赖的库让其不在使用废弃很久的这个动态库,或者将这个动态库从Xcode 9 下拷贝过来,但后者做法不推荐。

Multiple build commands for output file /Developer/xxx/xxx.xxx

这个问题需要把 Build Phases -> Output Files 中 ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH} 这个删除,每次 pod install 后都会生成这个,手动把它删除即可。

这样,再将依赖的 Swift 语言开发的三方库做一波更新就可以了,后面有遇到问题再更新吧。

参考链接


comments powered by Disqus