美文网首页码农的日常之iOS开发swiftiOS备忘录
Swift3.0已出坑-适配iOS10,项目迁移Swift3.0

Swift3.0已出坑-适配iOS10,项目迁移Swift3.0

作者: RamboLu | 来源:发表于2016-10-15 00:58 被阅读21694次

前言

文章来源个人博客:http://www.rambolu.top/2016/10/15/Swift学习-Swift3-0已出坑,适配iOS10-项目迁移Swift3-0问题总结。/
Swift项目,为适配iOS10,无奈只能更新Xcode 8 ,可是发现一入3.0深似海,从此幸福是路人.于是边摸索边修改,在节前的完成代码迁移.节后在完成手头工作后,整理思路,把Swift3.0迁移的心得分享大家.
废话不多说分享下心得:

1、代码篇:(一定要做好备份!!!)


1>升级Xcode8正式版(8A218a).

Xcode 8

2>使用系统自带的桥接工具.(原装的就是好,直接打开2.2项目也会提醒->步骤:3)

Edit > Convert > To Current Swift Syntax..
桥接选项

3>不用说就是为3.0来的,选择Swift3.

Swift3.0

4>上面的框架就不用选了,只选择.app的.(这个是检测代码,不然你会哭的)

.app

5>检测完后.

在左边的选择页中选择好要转移的代码,左边的代码是Swift3.0代码,右侧代码时Swift2.2代码->点Save.

6.png

2、第三方框架篇:(使用的cocoapods管理的第三方框架)


1>发现框架报错.(不要怕,按照错误一样一样来)

  • 问题1:--.第三方框架版本问题,"Use Legacy Swift Language Version"

“Use Legacy Swift Language Version” (SWIFT_VERSION) is required to be configured correctly for targets which use Swift. Use the [Edit > Convert > To Current Swift Syntax…] menu to choose a Swift version or use the Build Settings editor to configure the build setting directly.

第三方框架版本问题
在pod的配置文件里面的Use Legacy Swift Language Version选择YES错误就消除了
Pods->TARGETS->指定框架 -> Build Settings -> Use Legacy Swift Language Version
pod的配置
  • 问题2:--.lipo:can't open input file:xxx(No such file or directory)
lipo:

PROJRCT-> Build Settings -> Build Active Architecture only->YES

lipo

其他问题后续收集再整理...

2>发现框架过时,需要更新框架.

由于3.0的更新,Swift各个主流框架都已经及时的推出了新的版本,例如:Alamofire 4.0.0 , SnapKit 3.0.0 , Kingfisher 3.1.0 , SwiftyJSON 也已经更新了专供Swift3的分支.
所以,要更新框架以供使用.

更新主流第三方框架
pod 'SnapKit', '~> 3.0.0'
pod 'SwiftyJSON', :git => 'https://github.com/acegreen/SwiftyJSON.git', :branch => 'swift3'
pod 'Alamofire','~> 4.0.0'
pod 'Kingfisher','~> 3.1.0'

可能会出现以下问题:

  • SnapKit框架问题:
SnapKit

看到200多个框架错误后凌乱了.都是3.0语法了,为什么还会报错,不在框架,在自己安装的cocoapods环境有关系.

解决方案:
需要更新最新环境到cocoapods 1.1.0.rc.2

sudo gem install cocoapods --pre

可以参照SnapKit的官方issues:
https://github.com/SnapKit/SnapKit/issues/300
如果没有安装 cocoapods可以参照之前写的博客.
安装 cocoapods 1.1.0心得体会:

  • Alamofire框架问题:
Alamofire

Alamofire/Source/ServerTrustPolicy.swift:243:41: Use of unresolved identifier 'kSecTrustResultInvalid'

Alamofire的官方issues:
https://github.com/Alamofire/Alamofire/issues/1541

解决方案:
上面也提到了,更新最新的Alamofire框架.

pod 'Alamofire','~> 4.0.0'

可能还遇到的问题:

[!] Unable to satisfy the following requirements:

- `Alamofire (~> 4.0.0)` required by `Podfile`

Specs satisfying the `Alamofire (~> 4.0.0)` dependency were found, but they required a higher minimum deployment target.

解决方法:
Alamofire 4.0.0 最低要求系统版本9.0,已经将系统升高到9.0还是无法安装.
目前的没有找到有效的解决方法,只有一个方案就是重新立项先集成框架,在把转接完的代码迁移到新的项目中去.


10月24日,更新解决方法.
之前提示Alamofire 4.0.0, Podfile报错.
需要在Podfile文件中指定最低系统9.0项目版本.platform :ios,'9.0'
Alamofire的官方issues:
https://github.com/Alamofire/Alamofire/issues/1639

指定9.0
  • 可能还会有其他框架问题,目前还没有遇到.欢迎讨论.

3.其他问题总结:


  • 关于重建工程来迁移到Swift3.0解决方案.

前面也提到了,发现有个别问题无法解决,一直解决也是没有成效,于是使用目前来说最简洁的方法就重新建立工程.

先把新建的工程集成好最新支持Swift3.0的第三方框架,测试程序可不可以跑通后,再把之前转换完的代码一个分类一个分类迁移到新的工程里面.

至于手工拖入的第三方依赖库,应用跳转,按照之前集成好的照搬.或者重新集成.

  • Swift3.0语法的学习.

1.官方已经给出文档以及转变说明.
Apple Swift 3.0官方文档:The Swift Programming Language (Swift 3)

Apple Swift 3.0官方文档

2.Apple Swift 3.0官方演变:apple/swift-evolution/releases/swift-3_0.md

Swift 3.0官方演变

其主要是废除了一些API,简化代码的书写,例如取出OC中的NS类前缀,C语言的风格,等等.

3.国外raywenderlich的Swift 3.0迁移介绍:
https://www.raywenderlich.com/135655/whats-new-swift-3

raywenderlich的Swift 3.0
  • 后续持续补充.

后记

  • 对Swift3的书写方式还需要进一步的加强,虽然和之前的写法有着轻微的改动,使整体变的更加的简洁、严谨,但是稍不注意还是出现莫名其妙的报错.
  • 展望Swift4,让暴风雨来的更猛烈些吧.
  • 欢迎讨论、批评、指正、并点击个人博客:http://www.rambolu.top .

相关文章

网友评论

  • Waisti:👏
  • 樊二哈:我如果没有使用pod,出现这种情况怎么办
    novice_Qin:我用pod添加Kingfisher出这三个错误是什么原因:
    Value of type 'CIImage' has no member 'cropped'
    Incorrect argument label in call (have '_:parameters:', expected '_:withInputParameters:')
    @ObjC cannot be applied to this declaration





    RamboLu:@樊呵呵 直接导入的框架文件包?
  • Cc大个子:楼主 我的xcode里怎么没有 Use Legacy Swift Language Version 这个选项
    RamboLu:@Cc大个子 哦,你可能选择的是自己的项目Build Settings,选择Pods里面指定框架的 Build Settings.
    Cc大个子:@RamboLu 是选择了Build Settings 也是all。我这里只有一个swift language version
    RamboLu:恩,你可以看下类别是Build Settings里面的,选择All还是别的.
  • 863c73f31933:楼主,你那里oc中写的block,在swift文件中使用的时候有报cannot connect value of type '(Response?,NSError?) ->Void' to expected argument 'NativeNetworkBlock',这种错误不?
    863c73f31933:@RamboLu 在这段报错提示前面有小红点,可以fix的,不过fix之后还是报这个错,感觉这里需要手动修改
    863c73f31933:@RamboLu 这段代码在swift2.3没报错,是升级3.0的时候报的错误,Na那个是在oc中自定义的block,也就是报错的那个block的名称
    RamboLu:oc混编的没有涉及block调用,用到的框架都是swift的,NativeNetworkBlock参数又是什么?网络请求么?是不是swift的语法书写有误?
  • quua:我的 cocoapods 版本
    cocoapods (1.1.1, 1.0.1)
    cocoapods-core (1.2.0.beta.1, 1.1.1, 1.0.1)
    cocoapods-deintegrate (1.0.1, 1.0.0)
    cocoapods-downloader (1.1.2, 1.1.1, 1.1.0)
    cocoapods-plugins (1.0.0)
    cocoapods-search (1.0.0)
    cocoapods-stats (1.0.0)
    cocoapods-trunk (1.1.1, 1.0.0)
    cocoapods-try (1.1.0)


    [!] Unable to satisfy the following requirements:

    - `Alamofire (~> 4.0)` required by `Podfile`

    None of your spec sources contain a spec satisfying the dependency: `Alamofire (~> 4.0)`.


    执行
    source 'https://github.com/CocoaPods/Specs.git'
    platform :ios, ’10.0’
    use_frameworks!

    target ‘xx’ do
    pod 'Alamofire', '~> 4.0'
    end

    报错了

    You have either:
    * out-of-date source repos which you can update with `pod repo update`.
    * mistyped the name or version.
    * not added the source repo that hosts the Podspec to your Podfile.

    Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by default.


    啊啊啊啊、好伤心...
    RamboLu:@quua 所以错误信息已经提示,需要你pod repo update,这个是更新cocoapods镜像库
    quua:@RamboLu 好奇怪、最高是 -> Alamofire (3.4.1)
    RamboLu:@quua 你pod search Alamofire,看你镜像库里面, Alamofire最高版本是多少.
  • 3aff5ed87402:请问下第三方库全是手动导入的话(不是用pod导入),在适配swift3.0时是如何进行转变的
    RamboLu:@无奈的小男孩1 像SnapKit,还需要更新cocoapods环境
    RamboLu:@无奈的小男孩1 导入适配swift3的最新框架呢
  • 韩大熊宝要姓张:感谢分享.谢谢.
  • b96acac40a08:swift3.0支持到iOS几啊?
    RamboLu:@欲狼 xcode8最低支持iOS8.0,主流swift框架最低支持到9.0. :smiley:
  • VanChan:不知道楼主有没有解决9.0也无法安装alamofire4.0的问题啊, 不是按文章中另外建项目的方法
    RamboLu:@VanChan :smiley: 所以坑还是很多的
    VanChan:@RamboLu 哎呀我去, 我把这里给忘了, 真是
    RamboLu:@VanChan 恩,文章忘更新了,podfile文件指定最低版本.platform :ios,'9.0'.之前失误,指定最低按版本还是8.0,导致的无法安装.
  • 十一岁的加重:让暴风兩来得更猛烈些吧
    RamboLu:@十一岁的加重 :smile::smile:
  • Twenty_:https://github.com/zwaldowski/BlocksKit/issues/351 博主 我用Blocks-Kit 的错误 这是swift3.0的错误,还是框架的错误
    RamboLu:@Twenty_ 嗯,是Swift项目桥接的OC呢?只需要转Swift部分就可以
    Twenty_:@RamboLu 我现在是OC+ swift 都在项目里... 目前卡死在 swift 2.3
    RamboLu:@Twenty_ 这个框架不是oc的框架?Swift项目中没有使用这个,闭包已经很简便了,
  • akkkk:想兼容用iOS8.0系统,项目升级swift3.0后,很多支持swift3.0的框架最低支持iOS9.0。
    可以解决吗
    RamboLu:@akkkk 可以不使用cocoapods来管理,直接把框架拖入到工程中,再手动剔除警告的代码,可以这样尝试,等到项目最低要求到9.0可以再用cocoapods管理,
  • Double丶K:mark
    RamboLu:@KK先森 :pray::pray:
  • Dylan_Yu:还有 update to recommended settings
    RamboLu:@Richard_Yu 嗯嗯,:stuck_out_tongue_winking_eye:
  • 梦里风吹过:项目至今没敢升级,新项目已经开始用3.0了
    RamboLu:@谷尚科技iOS 可以尝试下,有问题可以再分享 :smiley:
  • 042a0e1be73f:还是用oc的路过。。。
    RamboLu:@棍武中原 首先语法相对OC方便简洁,代码量减少许多,再者swift可以看到java,c#,c++,py,js等众多语言的影子,降低了开发门槛,让别的开发者快速入门,还有就是现在apple主推使用swift,好多oc的优秀的第三方库已经暂缓更新了,全力开发swift框架。
    棍武中原:@RamboLu swift不习惯而且坑很多,不知道大厂为什么选择swift
    RamboLu:@iOSwift :joy: 还是oc得坑少
  • 巴图鲁:膜拜
    RamboLu:@巴图鲁 :pray: :pray:

本文标题:Swift3.0已出坑-适配iOS10,项目迁移Swift3.0

本文链接:https://www.haomeiwen.com/subject/xgsnyttx.html