更新swift4所遇到的问题
前言
因为xcode9同时支持Swift4和Swift3.2所以在升级Swift4的时候心没有那么的痛,在转换成Swift4时错误集中在添加@objc
上,如果项目是OC和Swift共存的项目,那么添加@objc
会让你加到怀疑人生。
@objc
【更新swift4所遇到的问题】1、在Swift4中,OC和Swift共存的项目不再无脑将Swift的Public属性和方法提供给OC,除非Swift中的方法和属性用@objc
标记,这样就减少了一些代码的生成从而减少了包的大小。build之后我们是纯swift项目所以大部分是在选择器调用的方法前面也要添加@objc
。
2、我们的项目是Swift的项目所以build保存很快就修改完成,Run起来后如期的Crash了。这个是因为我们的JSON转Model是使用的OC版的Mantle和SwiftJSON进行的解析,那么就要在所有的Model属性前面添加@objc
,不然Mantle在获取类属性类型的时候是空的。看到这个时候内心是崩溃和拒绝升级Swift4的,所以我们选择舍弃Mantle使用Codable。
Codable( 官方文档)
1、在OC中JSON转Model只能转化为对象类型,在Codable支持JSON转为常规类型。而遇到的更多的是将数据模型中的NSNumber改为Int或者Double,这是因为NSNumber是OC的类型不遵守Codable的。
2、有时候我们会在Model中添加一些JSON串没有的字段进行逻辑处理,类似
struct A: Codable{
var a: Int?
var isSelect: Bool = false
}
因为"isSelect"是为了逻辑处理在JSON串中并不能找到相应的字段,这个时候就会报出数据丢失的错误,而我们只需要将“isSelect”改成可选就可以了。
stuct A: Codable {
var a: Int?
var isSelect: Bool?
}
在这次升级中主要是在改这OC调用Swift添加
@objc
的问题和将数据解析改成Codable。还有一些错误是因为使用Mantle转JSON串出现的问题只要使用JSONEncode
,还有会多出字符串长度判断使用characters
的警告删除它就OK了。平常使用泛型一个很烦的操作 我定义一个带有泛型的方法
private func getData(a: T) {}
直接调用
self.getData(a)
因为不知道泛型的类型而出现
Cannot explicitly specialize a generic function
的错误, 如果不指定类型
self.getData(a)
会出现下面的额错误
Generic parameter 'Element' could not be inferred
只能在使用时进行一次强转
self.getData(a as A)
就是让Xcode推断出他的类型而不是你告诉他这个泛型是什么类型,这就很烦。
感谢观赏
推荐阅读
- 六月更新的......
- 列出所有自定义的function和view
- 美之初体验—我所感受到的那一点儿
- 归乡-序章(世界伊始,人类无所依靠,我的故事就从这里开始...)
- 幸福的人都是相似的,所有幸福的女人,都做好了这2点
- 恶魔天使
- 【诗】我愿我愿
- 不理解句意,你还想做对所有GRE填空题()
- 财富自由之路
- 你以为你熬过了所有的难熬的夜,却不知何时到白天