更新swift4所遇到的问题

前言

因为xcode9同时支持Swift4和Swift3.2所以在升级Swift4的时候心没有那么的痛,在转换成Swift4时错误集中在添加@objc上,如果项目是OC和Swift共存的项目,那么添加@objc会让你加到怀疑人生。

@objc

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<T>(a: T) {

}

直接调用

self.getData<A>(a)

因为不知道泛型的类型而出现

Cannot explicitly specialize a generic function

的错误, 如果不指定类型

self.getData(a)

会出现下面的额错误

Generic parameter 'Element' could not be inferred

只能在使用时进行一次强转

self.getData(a as A)

就是让Xcode推断出他的类型而不是你告诉他这个泛型是什么类型,这就很烦。


感谢观赏

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,229评论 4 61
  • 一趟列车 情系着回家的路 也情系着你我的梦 它曾把你我分别 也曾把这梦捅破 虽然这样 它始终驱使着你驶向前方 它把...
    痴行者阅读 212评论 2 5
  • 真是该死的!我当初为什么要立志当上火影啊!看看这桌上一大堆见鬼的文件,明知道我就不擅长这个,也不给我找个得力的秘书...
    闻长安阅读 1,685评论 5 3
  • 题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不...
    FlyElephant阅读 246评论 1 0
  • 凤九醒来发现自己在一间朴素竹屋里,看着天色似是清晨。 凤九推开竹屋的门看见外面郁郁葱葱的竹林,忽然听见一阵咳嗽声,...
    韶华无忧阅读 5,702评论 6 17