食用指南

Xcode 8带着Swift 3风风火火的到来了,作为一个平时使用OC为主的iOS开发来说,Swift 3正式和OC-like语法划定了界限。您可以简单浏览本文,也可以把本文当做从Swift2.2迁移到Swift3的指南。如果您在迁移的过程中遇到了问题,不妨直接CTRL+F来搜索一下本文,看能不能找到解决方法。
因为本文是作为公司的内部培训资料,所以如果您在阅读的时候发现了错误或者是有更好的解决方法,欢迎联系我或者在下方留下您的评论。

1.苹果官方提供的Swift 3 更新内容(部分Objective-C语法也变更了)

1.1 语法上的形式变更

语法形式上的变更是非常方便理解的,在迁移过程中,Xcode会自动提示您转为对应的格式,形式变更的内容如下:

  • 系统提供的枚举类型默认转为小写 比如 UIButton(type: .Custom) -> UIButton(type: .custom)

  • 类型判断语法变化 object.dynamicType -> type(of: object)

  • UIViewController.statusBarStyle -> -(UIStatusBarStyle)preferredStatusBarStyle{}

  • Core Graphics API Swift化,基本来说这一部分能自动化就自动化转换,量太大了...

  • webview的代理方法- (void)webView:(UIWebView *)webView didFailLoadWithError:(nullable NSError *)error需要去掉nullable否则会报错

1.2 逃逸闭包必须显示声明

现在swift3.0所有的函数都是默认@noescape 非逃逸闭包,而 逃逸闭包(闭包在函数调用完之后才被调用的)必须显示声明@escaping,比如:

func transport(requestMethod: Alamofire.HTTPMethod,url: String,callback: @escaping (Any) -> Void) -> Void {}

1.3 typealias 支持泛型

这带来了什么?更加抽象的CollectionType,甚至是更加便捷的JSON转模型方法

1.4 selector支持属性的getter和setter方法

class Dog {
    var dogName: String
}

let dogNameGetter = #selector(getter: Dog.dogName)

1.5 dispatch完全抛弃C-like 写法

是的,您的Snippet应该更新一下了!大部分旧写法都能找到新的写法替换,不过对于dispatch_once来说就完全被废弃,您可以使用 懒加载 来替代。

dispatchQueue.global().async {
    // 异步操作
    dispatchQueue.main.async {
        // 主线程操作
    }
}

dispatchQueue.global().sync {
    // 同步操作
}

//创建队列
let serialQueue = dispatchQueue(label: "Queuename")

//延迟执行
let delay = dispatchTime.Now() + dispatchTimeInterval.seconds(\Seconds)
dispatchQueue.main.asyncAfter(deadline: delay) { 
}

1.6引入系统版本判断代码

if #available(iOS 10.0,*){
    //您的代码
}

1.7Any类型会逐渐开始使用

在Swift2的项目中,可能使用AnyObject更加频繁,因为在Swift2 中编译器默认做了基本类型到OC类型的桥接。在Swift3中,这类桥接被废弃,所以需要明确Any和AnyObject的区别,也就是Any包含AnyObjectAny类型包括struct、class、selector等,而AnyObject只对应class

2. iOS 10给迁移带来的其他需要注意点

2.1 2017年1月1日之前强制使用HTTPS

在iOS9中默认HTTP是被禁止的,可以在info.plist中通过设置NSAllowsArbitraryLoadsYES打开。新iOS 10如果要访问网络也可以如iOS 9 一样设置来访问网络,但是这在2017年1月1日之后有可能会被拒绝,您可以通过NSExceptionDomains来针对特定域名开放HTTP访问。

2.2 隐私权限更严格了

iOS 10开始约束隐私权限了,如果您用到 相册、相机、位置、蓝牙、提醒事项、运动健康数据、麦克风、日历 等情况,您需要手动在info.plist中添加权限请求说明。否则很大几率会闪退,This app has crashed because it attempted to access privacy-sensitive data without a usage description.
添加的字段名如下图所示:

2.3 默认不提供网络访问权限

iOS 10默认不提供网络访问,也就是说,刚刚进入应用,在用户没有点击“同意App访问蜂窝数据”之前是无法访问网络的。即使在用户点击确认之后,App往往没有设置自动刷新,用户体验很差的,希望您能注意一下。

2.4 字体变大,低版本显示正常的Label在iOS10中变成“...”

iOS10使用了新字体,文字的宽度变大了,之前如果是UILabel写死宽度或者定死宽度约束的很可能就会出现文字变成“...”,需要手动处理一下。UILabel大部分时候只需要给一个Origin Point就够了,文字的大小实际上不需要写死的。

2.5 推送需要明确打开Capability

在XCode7中这里的开关不打开,推送也是可以正常使用的,但是在XCode8中,这里的开关必须要打开,不然会报错

Error Domain=NSCocoaErrorDomain Code=3000 "未找到应用程序的“aps-environment”的授权字符串" UserInfo={NSLocalizedDescription=未找到应用程序的“aps-environment”的授权字符串}
打开后会在本地生成entitlements文件

3. Xcode 8给我们带来了哪些便利和麻烦

3.1 Xcode 8内置的Swift迁移工具

总的来说,这次迁移工具帮了很大的忙。如果您打开一个Swift 2工程,迁移会主动提示您打开了一个Swift 的旧工程,问您是不是要自动进行语法转换。本人建议您进行手工迁移,反正我是从来没有一次性迁移成功过的。手动迁移也没有特别麻烦,迁移工具在局部的语法提示会快速帮您定位需要迁移的位置。在我看来,自动迁移提示存在的目的在于帮您检测了集成的第三方库是不是也是用Swift 3语法写的。

3.2 Xcode 8完全不支持旧有的插件了

是的,完全不支持了,也不再支持Alcatraz提供的插件,VVDocumenter、FuzzyAutocomplete、cocoapods-plugin 手动再见~~ Xcode官方的说法是为了安全考虑。的确,疯狂装插件在崩溃的时候要找到出问题的插件还是要花费一番功夫的。而且Xcode现在可以方便的开发编辑器插件了,只不过这些新插件的功能真心太弱了,太弱了...是的,我指的是,在座的各位新插件都是弱鸡。目前的解决办法是对Xcode进行重签名,然后生成一个“越狱版”的Xcode放在应用程序目录,教程链接地址在此。或者要不我们还是继续用Xcode 7.3.1吧...反正我是戒掉插件了。

3.3 Swift 2.3的使用

Xcode 7.3.1 是Swift 2.2 版本,而Xcode新建的工程默认都是基于Swift 3.0 的,如果您的工程是基于Swift2.3的版本的,您需要在Xcode 8.0 的 Build Settings - Use Legacy Swift Language Version中将参数的值设为Yes,不过需要注意的是,如果是用Swift2.3的工程,第三方的工程也需要为Swift 2.3的版本,在您建立工程的时候,您应该提早确定您使用的第三方库是否支持Swift 2.3 。

3.4 Xcode 8现在支持图片文件名补全

Xcode 8现在支持图片文件名补全,在您键入UIImage(named: "ImageName")的时候会自动提示您工程中的图片,当然您也可以直接键入图片名称,即UIImage(named: "ImageName") -> ImageName,Xcode会在图片名称的前面建立一个小的缩略图,真的很小。

3.5 Xcode 8需要开启注释

如果遇到按CTRL + /注释没有效果了,那可以在终端里敲上~ sudo /usr/libexec/xpccachectl,然后重启电脑试试。

3.6 Xcode 8疯狂打印一大堆Log

在工程Edit Scheme中添加参数,如下图所示:

3.7 Xcode代码签名优化

总的来说是苹果帮您把签名管理起来了,就是一般不会出现Fix issue的黄色小三角形了,没有特别需要我们做的。

3.8 旧版本的Xcode无法打开Xcode 8保存过的storyboard和xib了

因为新的Interface Builder添加了初始化界面的功能,默认打开旧有的storyboard和xib会询问您是否将所有视图设定为一个统一的尺寸,如果您点击确认,只需要更新一下frame就可以看到结果,但是这在团队协作中会带来一个问题,在版本管理中,一旦push代码之后,团队中使用Xcode 8以下的成员就无法打开新版本的storyboard和xib了,解决方法是在Source Code层面打开storyboard或者xib,手动删除<capability name="documents saved in the Xcode 8 format" minToolsversion="8.0"/>即可。

3.9 在Xcode中使用类似VVdocument的功能

快捷键:option + command + /

3.10 你可以每7天创建10个APP IDs

每个阶段能创建的App ID数量会有限制,你可以每7天创建10个APP IDs

4. 一些小的注意点

4.1 Cocoapod还是主力的包管理工具

可能您听说过SPM(Swift Package Manager),这个类似NPM的包管理工具在很早官方就发布消息说要支持了,但是实际应用中,很多第三方库目前并不支持(至少从目前来看),工具的使用远远没有Yarn之于NPM那样的平滑迁移,所以目前还是建议使用Cocoapod或者是Carthage吧!

4.2 RealmSwift 在Swift 3.0上要求进行数据库升级

准确的说,是当您将RealmSwift升级到3.0能支持的版本之后,在操作数据库的时候要求您升级数据库。所以还是一步到位升级到3.0吧,别在2.3再折腾一遍了。

4.3 Alamofire 3.0不再支持iOS 8

反正我放个图:

4.4 Cocoapods 中强制使用 Swift 3 语法

只需要在Podfile中添加:

#swift 3 adapt
post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['SWIFT_VERSION'] = '3.0'
    end
  end
end

4.5 获取特定branch、tag、仓库的第三方库

在刚刚开始适配Swift 3的阶段,会遇到相当多的问题,比如:

  • 作者还没有到Cocoapods官方设置更新信息

  • 作者将Swift 3的版本建立在其他分支上,默认支持的还是2.2或者是2.3的版本。

  • 作者根本还没有支持Swift 3 ,不过有热心的网友建了一个自己的仓库,帮忙适配了一下

这时候您可以尝试在pod后面添加一些描述信息来定位到您真正想要获取到的库的位置,比如这里就把SwiftyJSON库的获取地址转到了IBM维护的一个仓库上:

pod 'SwiftyJSON',:git => 'https://github.com/IBM-Swift/SwiftyJSON.git',:branch => 'master'

一个才适应Swift2.2的开发者眼中的Swift 3.0和iOS 10的更多相关文章

  1. HTML5 播放 RTSP 视频的实例代码

    目前大多数网络摄像头都是通过 RTSP 协议传输视频流的,但是 HTML 并不标准支持 RTSP 流。本文重点给大家介绍HTML5 播放 RTSP 视频的实例代码,需要的朋友参考下吧

  2. 利用Node实现HTML5离线存储的方法

    这篇文章主要介绍了利用Node实现HTML5离线存储的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. 详解如何通过H5(浏览器/WebView/其他)唤起本地app

    这篇文章主要介绍了详解如何通过H5(浏览器/WebView/其他)唤起本地app的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  4. H5混合开发app如何升级的方法

    本篇文章主要介绍了H5混合开发app如何升级的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. AmazeUI 折叠面板的实现代码

    这篇文章主要介绍了AmazeUI 折叠面板的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码

    这篇文章主要介绍了HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

  7. Html5 video标签视频的最佳实践

    这篇文章主要介绍了Html5 video标签视频的最佳实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  8. html5唤起app的方法

    这篇文章主要介绍了html5唤起app的方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  9. HTML5拍照和摄像机功能实战详解

    这篇文章主要介绍了HTML5拍照和摄像机功能实战详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部