适配swift3

紫洁 紫洁     2022-08-20     518

关键词:

Any vs AnyObject

将项目里的 AnyObject 转成 Any 可能是大家遇到的第一件适配大事。如何解释这个变化呢?在 Swift 3 之前,我们可以写完一个项目都只用 AnyObject 来代表大多数实例,好像不用与 Any 类型打交道。但事实上,Any 和 AnyObject 是有明显区别的,因为 Any 可以代表 struct、class、func 等等几乎所有类型,而 AnyObject 只能代表 class 生成的实例。

那为什么之前我们在 Swift 2 里可以用 [AnyObject] 声明数组,并且在里面放 Int、String 等 struct 类型呢?这是因为 Swift 2 中,会针对这些 Int、String 等 struct 进行一个 Implicit Bridging Conversions,在 Array 里插入他们时,编译器会自动将其 bridge 到 Objective-C 的 NSNumber、NSString 等类型,这就是为什么我们声明的 [AnyObject] 里可以放 struct 的原因。

但在 Swift 3 当中,为了达成一个门真正的跨平台语言,相关提案将 Implicit Bridging Conversions 给去掉了。所以如果你要把 String 这个 struct 放进一个 [AnyObject] 里,一定要 as NSString,这些转换都需要显示的进行了——毕竟 Linux 平台默认没有 Objective-C runtime。

@discardableResult 的使用

在 Swift 3 编译器下,如果一个 func 返回了一个对象,而你没有使用它时,会有一个 WARNING。对于追求项目洁癖(不想看到 1 个 WARNING 和 1 个 ERROR)的人来说这是不能忍的,尽管你可能是故意不去使用它的。

这里有两种方法可以解决这个 WARNING。

第一种:在 func 定义的前面,加上 @discardableResult 的修饰符,代表可以不使用返回值,这样编译器就不会有警告了。在我们自己定义的 func 上基本上都可以这么做。

但是还会有一种情况,用了第三方库或者系统库返回的对象怎么办?那只能用第二种办法:

_ = navigationController?.popViewController(animated: true)

像这样通过 _ 来省略掉了。虽然比较难看,考虑到 Swift 是一门严格的语言,就忍忍吧。

Protocol 实现一定要在对应的 extension 里

以前写代码时会有不注意的地方,比如 UITableViewDelegate 和 UITableViewDataSource,我分别用 extension 来实现,但是在具体的实现中没注意,把 delegate 的一个方法放进了 dataSource 的 extension 去实现,项目也能完全正常运作。

但是在 Swift 3.0 下,如果你在一个 extension 里实现一个 protocol,那么这个 protocol 的方法一定要在这个 extension 里面能找到,而不能在另外一个 extension 里或者主 class 或 struct 里面。不然会有类似这样的警告:

Objective-C method ‘tableView:canEditRowAt:‘ provided by method ‘tableView(_:canEditRowAt:)‘ does not match the requirement‘s selector (‘tableView:canEditRowAtIndexPath:‘)

这也是 Swift 3 编译变得更严格的一个表现。

Implicitly Unwrapped Optionals 的坑

在 Swift 2 的项目中,我们可能存在这样不是特别安全的代码:

var greetings: String!
greetings = "Hello"
print("(greetings) 图拉鼎")

这里会输出:

Hello 图拉鼎

没有任何问题。但是在 Swift 3 中,因为 Optional 的安全机制起作用了,会变成:

Optional("Hello") 图拉鼎

这个结果不是我们想要的。从这点也可以看到,Swift 3 的 IUO 行为变得更安全了,默认会把 IUO 变成 Optional。如果想要达到和 Swift 2 一样的效果,就得用:

print("(greetings!) 图拉鼎")

这时你也注意到了,Swift 始终在用 ! 提醒你用 IUO 不那么安全。

Alamofire 最低支持iOS9

虽然说我使用的三方库都在第一时间将库升级到了 Swift 3 ,但是期中 Alamofire 库最低适配只支持到了 iOS 9。

 

参考:https://zhuanlan.zhihu.com/p/22584349

swift2.3适配swift3.0时出现的各种问题

...媳妇儿总要见公婆,借这个机会,也趁双休时间,做一下适配好了。  首先,强调一点。做好备份!做好备份!做好备份!重要的事情说三遍。 1.关于使用的Swift代码库的问题  这是我最心力交瘁的一个问题。  项目... 查看详情

如何使用 iOS CoreBluetooth 从 dex 无线适配器中检索 DEX?

】如何使用iOSCoreBluetooth从dex无线适配器中检索DEX?【英文标题】:HowtoretrieveDEXfromdexwirelessadaptorwithiOSCoreBluetooth?【发布时间】:2017-07-0104:21:55【问题描述】:我目前有一个Honeywell的DEXBLE-1适配器,用于从自动售货机检索dex数据。... 查看详情

swift3.0-黑魔法swizzle

参考技术ASwift3.0-真的很简单Swift3.0-数据类型Swift3.0-ArraySwift3.0-字典Swift3.0-可选值Swift3.0-集合Swift3.0-流控制Swift3.0-对象和类Swift3.0-属性Swift3.0-函数和闭包Swift3.0-初始化和释放Swift3.0-协议protocolSwift3.0-类和结构体的区别Swift3.0-枚举Swif... 查看详情

Swift3:类型 numberformatter 没有成员“货币样式”,swift3

】Swift3:类型numberformatter没有成员“货币样式”,swift3【英文标题】:Swift3:Typenumberformatterhasnomember\'currencystyle\',swift3【发布时间】:2016-09-2206:10:57【问题描述】:在Swift3中似乎有很多语法发生了变化,我无法找到这个currencyStyle... 查看详情

swift3.0变化分享

Swift3.0做出的改变很大,在这篇文章中,我将尽我所能,利用代码样例给大家解释Swift3.0最重要(要命)的改变,希望大家能够做好升级Swift3.0的准备。Swift3.0的改变不仅仅是我下面的这个列表,但是列表中的每一项都是对你的一... 查看详情

swift3.1的一些新特性

Swift3.1的一些新特性  推荐序本文来自泊学的投稿,介绍了Swift3.1的新特性,感谢泊学授权发表。以下为文章正文。正文Apple终于发布了Xcode8.3以及Swift3.1。如果你没时间仔细通读一遍releasenote,至少,Swift3.1中的一些新特性... 查看详情

Swift3 迁移问题

】Swift3迁移问题【英文标题】:Swift3Migrationissues【发布时间】:2016-12-2706:41:26【问题描述】:得到错误:表达式类型\'[NSLayoutConstraint?]\'在没有更多上下文的情况下是模棱两可的”从Swift2.2迁移到Swift3之后。letconsAry=[emailBottom,pwrdBo... 查看详情

swift3.1的一些新特性

Apple终于发布了Xcode8.3以及Swift3.1。如果你没时间仔细通读一遍releasenote,至少,Swift3.1中的一些新特性还是值得了解的,为此,我们特别制作了一个免费的内容系列。当然,Swift3.1和Swift3在源代码级别是兼容的,因此,如果你的项... 查看详情

突然兴起复习一下swift3.0

///参考Swift3.0.1文档///摘录来自:AppleInc.“TheSwiftProgrammingLanguage(Swift3.0.1)”。iBooks.importUIKitclassViewController:UIViewController{overridefuncviewDidLoad(){super.viewDidLoad()aSwiftTour()}funcaSwiftT 查看详情

swift3新特性

原文:What‘sNewinSwift3? ,作者:BenMorrow,译者:kmyhySwift3将于今年下半年推出,为Swift开发者们带来了很多核心代码的改变。如果你没有关注过SwiftEvolution项目,你可能会好奇Swift3中有什么改变,它会对你的代码带来什么影响... 查看详情

swift3 中的 SecKeyRawSign 和 SecKeyRawVerify

】swift3中的SecKeyRawSign和SecKeyRawVerify【英文标题】:SecKeyRawSignandSecKeyRawVerifyinswift3【发布时间】:2017-09-2205:48:10【问题描述】:我有一个字符串。我想在swift3中使用SecKeyRawSign和SecKeyRawVerify。我正在使用Xcode8.3.3funcsignString(string:Strin... 查看详情

Swift3:类型“NSObject”不符合协议“URLAuthenticationChallengeSender”

】Swift3:类型“NSObject”不符合协议“URLAuthenticationChallengeSender”【英文标题】:Swift3:Type\'NSObject\'doesnotconformtoprotocol\'URLAuthenticationChallengeSender\'【发布时间】:2016-09-2210:24:12【问题描述】:在Swift3中\'NSURLAuthenticationChallengeS 查看详情

将 fetchedResultsController 与 swift3 一起使用

】将fetchedResultsController与swift3一起使用【英文标题】:UsingfetchedResultsControllerwithswift3【发布时间】:2016-10-2505:08:46【问题描述】:我想在我的Swift3代码中使用fetchedResultsController。我尝试了thisway和其他方式,但我做不到。这是我... 查看详情

Swift3 中的 NSCalendar

】Swift3中的NSCalendar【英文标题】:NSCalendarinSwift3【发布时间】:2016-08-1309:50:17【问题描述】:在Swift3之前,我在一个项目中使用了这个函数:varcomponents=(calendarasNSCalendar).components([.year,.monthSymbols,.firstWeekday,.timeZone,.hour,.minute],from:... 查看详情

Swift3 中心 UIbutton

】Swift3中心UIbutton【英文标题】:Swift3centerUIbutton【发布时间】:2016-09-2210:45:50【问题描述】:好的,我在.swift故事板中添加了一个按钮,然后我将以下代码添加到我的ViewController.swift中@IBOutletweakvarHelloButton:UIButton!overridefuncviewDidL... 查看详情

swift3解析模型问题

】swift3解析模型问题【英文标题】:swift3parsingwithmodelissue【发布时间】:2016-12-2600:48:04【问题描述】:您好,我正在尝试解析这个json文件:http://pastebin.com/TCdkJnvZ这是我用我要解析的信息制作的类:publicclassRecipe:NSObjectvarrecipeID:NS... 查看详情

Swift3 - 调试时后台获取崩溃

】Swift3-调试时后台获取崩溃【英文标题】:Swift3-BackgroundFetchCrashonDebug【发布时间】:2016-10-2020:01:05【问题描述】:funcapplication(_application:UIApplication,didFinishLaunchingWithOptionslaunchOptions:[UIApplicationLaunchOptionsKey:Any]?)->Bo 查看详情

Swift3 和 JSON

】Swift3和JSON【英文标题】:Swift3andJSON【发布时间】:2016-10-2309:23:41【问题描述】:我正在尝试从我的服务器解析JSON,但出现了奇怪的行为。这是我的网络处理代码:importFoundation//Input:URLRequest//Output:returnsJSONorrawdatapublicletDANetwork... 查看详情