升级到Swift 4.0可能遇到的坑总结

2020-01-08 23:47:50于丽

前言

swift/37122.html">swift4.0已经出来一段时间,之前已经给大家总结介绍了关于swift4的新特性,那么本文就来介绍下当swift升级到swift4在使用中会遇到哪些问题呢?下面话不多说了,来一起看看详细的介绍吧。

升级Swift4.0

并不是所有库都能做到及时支持Swift4.0,更何况是在现在连Xcode9也还是beta的状态 所以我们仅能做到将自己的业务代码(主工程代码)部分升级到Swift4.0,然后同时保留各种pod库在Swift3.2版本。 没办法,谁叫Swift4.0也还无法做到API兼容呢(但愿能在Swift5之前实现吧)。 至于我说的同时使用两个版本的Swift,这是没问题的,Xcode9支持在项目中同时使用Swift3.2和Swift4.0。

一. 修改Swift版本

1. 如下图指定主工程的Swift版本为4.0

swift,4,升级,swift4.0

2. 修改pod库

在Podfile文件的最下方加入如下代码,指定pod库的Swift版本为3.2(这样会使得所有的第三方pod库的Swift版本都为3.2)


post_install do |installer|
 installer.pods_project.targets.each do |target|
 target.build_configurations.each do |config|
  config.build_settings['SWIFT_VERSION'] = '3.2'
 end 
 end
end

二. 主工程中的代码修改

1. 列举一下Swift3.2到Swift4.0的改变(只是我项目中遇到的):

1). Swift4.0中对于扩展的属性(包括实例属性、static属性、class属性),都只能使用get方法,不可使用set方法

2). Swift4.0中不再允许复写扩展中的方法(包括实例方法、static方法、class方法)

      比如:自定义的协议方法在extension中实现,若某个类遵循了该协议,其子类便不能重写该协议方法

      解决的方法是: 在每个需要该协议的类里面都重新遵循该协议,实现协议方法

      个人想到的办法,不知道有没有其他解决办法可以提供一下

3). swift3使用#selector指定的方法,只有当方法权限为private时需要加@objc修饰符,现在Swift4.0全都要加@objc修饰符

4). 自定义的protocol协议中,有optional修饰的非必须实现的方法,需要用@objc修饰

5). 字体方面的一些重命名


NSFontAttributeName --- .font 
//或者NSAttributedStringKey.font

NSForegroundColorAttributeName --- .foregroundColor
//NSAttributedStringKey.foregroundColor

NSStrikethroughStyleAttributeName --- .strikethroughStyle
//NSAttributedStringKey.strikethroughStyle

//字符串类型的,添加rawValue
NSAttributedStringKey.font.rawValue

//等等等等..........

//大部分类似以下,涉及富文本的方法均已改为了NSAttributedStringKey类型
addAttributes(_ attrs: [NSAttributedStringKey : Any] = [:], range: NSRange)