swift4更新中所遇到的一些问题总结

前言

最近Swift 4发布了,完整的更新日志请点击这里 >>: ,我大概看了下官方的更新日志,因为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推断出他的类型而不是你告诉他这个泛型是什么类型,这就很烦。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

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

    前言 swift4.0已经出来一段时间,之前已经给大家总结介绍了关于swift4的新特性,那么本文就来介绍下当swift升级到swift4在使用中会遇到哪些问题呢?下面话不多说了,来一起看看详细的介绍吧. 升级Swift4.0 并不是所有库都能做到及时支持Swift4.0,更何况是在现在连Xcode9也还是beta的状态 所以我们仅能做到将自己的业务代码(主工程代码)部分升级到Swift4.0,然后同时保留各种pod库在Swift3.2版本. 没办法,谁叫Swift4.0也还无法做到API兼容呢

  • Swift 4最全的新特性详细解析(推荐)

    引言 Swift,苹果于2014年WWDC(苹果开发者大会)发布的新开发语言,可与Objective-C共同运行于Mac OS和iOS平台,用于搭建基于苹果平台的应用程序.Swift吸收了众多现代编程语言的优点,尽力的提供简洁的编程语言和强大的功能. WWDC 2017 给大家带来了很多惊喜.Swift 4 也伴随着 Xcode 9 测试版来到了我们的面前,很多强大的新特性非常值得我们期待在正式项目中去使用它.因为 Swift 4 是开源的,如果你关注 swift-evolution 这个项目的

  • Swift 4.0中如何引用3.0的第三方库

    前言 第三方库是所有工程师在开发中都会经常用到的,熟练的掌握多个第三方库能把我们的生产力提升一大截,Swift 已经发布了 4.0 版本,在 Xcode9 中新建项目后,默认是使用 4.0 语法的.项目中的引用的第三方库,虽然有很多已经发不了 4.0 版本,但是还是有一些未及时更新的,那在作者未更新之前我们是否有更好的办法来使用这些第三方库呢? 答案当然是 肯定 的, Xcode9 中是同时支持 3.2 和 4.0 语法的. 具体的设置可以看下图. 那么下面就说说如何设置同时支持 3.2 和 4

  • swift4更新中所遇到的一些问题总结

    前言 最近Swift 4发布了,完整的更新日志请点击这里 >>: ,我大概看了下官方的更新日志,因为xcode9同时支持Swift4和Swift3.2,所以在升级Swift4的时候心没有那么的痛,在转换成Swift4时错误集中在添加@objc上,如果项目是OC和Swift共存的项目,那么添加@objc会让你加到怀疑人生. 下面主要给大家介绍了在更新过程中遇到的一些问题,下面话不多说了,来一起看看详细的介绍吧. @objc 1.在Swift4中,OC和Swift共存的项目不再无脑将Swift的P

  • python 读取更新中的log 或其它文本方式

    在项目中遇到这个问题,想把本地的log文件通过 Server-Send Event 的形式 发送给前端. 但是如何把那些 新增加log文本 读取出来就成了问题. 想过遍历log文件取得行数,读取最后几行文件,这种方式,不过缺点也很明显,log 文件很有可能会重复.因此在网上看了些介绍,也查了些资料,整理了如下代码. start_point=0 def read_logs(): fo = open("heakth_info.log", "rb") # 一定要用'rb'

  • IntelliJ IDEA 2020.2 配置大全详细图文教程(更新中)

    1.提示改为不区分大小写 File -> settings -> Editor -> General -> Code Completion 2.代码字体大小修改 2.1使用Ctrl+鼠标滚轮修改代码字体大小 File -> Settings -> Editor -> General 2.2常规方法修改代码字体大小.行距 File -> Settings -> Editor -> General -> Font 字体大小和行距因人而异,故不作

  • Vue3组件更新中的DOM diff算法示例详解

    目录 同步头部节点 同步尾部节点 添加新的节点 删除多余节点 处理未知子序列 移动子节点 建立索引图 更新和移除旧节点 移动和挂载新节点 最长递增子序列 总结 总结 在vue的组件更新过程中,新子节点数组相对于旧子节点数组的变化,无非是通过更新.删除.添加和移动节点来完成,而核心 diff 算法,就是在已知旧子节点的 DOM 结构.vnode 和新子节点的 vnode 情况下,以较低的成本完成子节点的更新为目的,求解生成新子节点 DOM 的系列操作. 举例来说,假说我们有一个如下的列表 <ul>

  • asp.net中ADO SQL数据库 笔记汇总 持续更新中

    ADO连接数据库 1)获取连接字符串 方式一: 记住连接字符串 connectionString=" Integrated Security=True; server=. ; database=DBName" 方式二:在visual studio中,点击"视图"à服务资源管理器à右击左侧的"数据连接",选择"添加连接"à服务名: 为一个点.选择数据库名,然后点击"高级",然后复制底部的连接字符串 2)在we

  • Mysql 错误问题汇总(不断更新中)

    1.Mysql errono 1005 : 主外键不是完全一致 , 请检查如下几点: a.字段是否存在 b.类型是否一致(注意unsigned , powerdesign 生成问题) c.数据库引擎是否一致 d.字符编码是否一致 e.windows平台下注意修改lower_case_table_names = 0, windows本身不区分文件大小写,改为0之后就区分了可能造成找不到引用的表 2.Mysql errono 121: 外键约束名称重复 3.记录 Mysql WorkBench 中单

  • javascript中的一些注意事项 更新中

    一.prototype原型对象,需要注意的原则是: (1). 使用原型可以大量减少每个对象对内存的需求量,因为对象可以继承许多属性. (2). 即使属性在对象被创建之后才被添加至原型中,对象也能够继承这些属性. 示例代码: 复制代码 代码如下: <script type="text/javascript"> function print(msg) { document.write(msg,'<br/>'); } function printhr() { docu

  • android中强制更新app实例代码

    推荐第三种方式,简单快捷不卡. 第一种:jjdxm_update GitHub地址:jjdxmashl/jjdxm_update 效果图: 点击立即更新,程序会在后台下载,通知栏有下载进度.这个时候手机系统很卡,可能由于是下载app的原因吧.下载完成后弹出安装界面 简介: 这是大神jjdxmashl的开源项目,下载地址见上方.有版本更新.手动更新.静默更新.自动更新4种情况.应用内更新,实现类是友盟自动更新sdk的模式,用户使用前只需要配置自己的服务器更新检查接口即可(必须接口),也可以扩展加入

  • 介绍PostgreSQL中的jsonb数据类型

    PostgreSQL 9.4 正在加载一项新功能叫jsonb,是一种新型资料,可以储存支援GIN索引的JSON 资料.换言之,此功能,在即将来临的更新中最重要的是,如果连这都不重要的话,那就把Postgres 置于文件为本数据库系统的推荐位置吧. 自从9.2开始,一个整合JSON 资料类型已经存在,带有一整套功能(例如资料产生和资料解构功能),还有9.3新增的操作者.当使用JSON 资料类型,资料的被存储成一完全一样的副本,功能还在此之上运作,还另外需要后台运作的重新分析. 这心得JSONB 资

  • 查询mysql中执行效率低的sql语句的方法

    一些小技巧1. 如何查出效率低的语句?在MySQL下,在启动参数中设置 --log-slow-queries=[文件名],就可以在指定的日志文件中记录执行时间超过long_query_time(缺省为10秒)的SQL语句.你也可以在启动配置文件中修改long query的时间,如: 复制代码 代码如下: # Set long query time to 8 seconds    long_query_time=8 2. 如何查询某表的索引?可使用SHOW INDEX语句,如: 复制代码 代码如下

随机推荐