前言
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

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)








