澳门新葡亰平台官网:新特征和迁移详细明白

写在前面

  • 斯维夫特 3.0 正式版发表了大约快叁个月了,时断时续的把手上和 Swift相关的动员搬迁到了Swift 3.0。所以写点小总计。

背景

代码量(4万行)

  • 首先,笔者是现年年终才起来开头 Swift 的。加上 Swift 的 ABI 和 API
    平素不安宁,所以未有在品种中山高校范围的采纳,所以本次迁徙的代码量相当的少,大致在4万行左右。

搬迁时间(一天左右)

  • 搬迁时间上的话,大致是花了1天左右。七个混编项目,一个 Swift
    为主
    的项目。期中 Swift 为主的类型
    花了大约大半天时间,两个混编代码量大致,可是三个花了小半天,还恐怕有二个基本上只花了一时辰(原因先留个悬念~)。

准备

在开辟最先开拓选用 斯威夫特 的时候的居多核定也让本身这一次少了累累职业量。

分界面用 xib 而不用纯代码

  • 一念之差的,和 斯维夫特 相关的大大多分界面都以用xib 画的。而那么些 xib
    在本次迁徙中获取了异常的大的优势,xib 和 SB 的代码不适配 Swift3。想当初假若行使代码写的 UI 的话,本次迁徙改良推测会多浩大吧。

有关第三方库的采纳:

  • 对于一个门类来说,三方库如同成了生龙活虎道必选菜,然而什么去筛选那道菜呢?

  • 对于三方库,当初的取舍是,能用 OC 就尽也许用 OC。 毕竟能够OC
    可以无缝衔接到 Swift,并且还相对平静。

  • 在选择 Swift 相关的三方库时,小编尽恐怕值选择使用者比非常多的库,比方AlamofireSnapKingfisherFabric等,因为使用者超多,开辟者会更乐于去维护,而不至于跳票。所以不会存在今后众多友人面前境遇的标题,想迁移,可是有些库没有立异。起码对于本人的话,当本人想迁移的时候,全体和
    Swift 相关的三方库都早已搬迁到了 3.0 了。

得益于下面两点,在搬迁进度中少了众多工作量。????

文化储备晋级

  • 先精通了一下Swift 2 到 斯维夫特 3
    的改换,及退换的由来。(看完心中风华正茂万头草泥马飞过,不过实际是更进一层好了)

    • Swift官博

    • swift-evolution

    • 斯维夫特 3
      新特征一览

  • 下一场把语俄语档快捷的故技重施了三遍。

    • Swift Programming Language

    • 中文版

搬迁中的难题

Any && AnyObject

  • 本身想在做动员搬迁和做完迁移的校友改的最多的七个正是  as AnyObjct? 吧?

  • 起码对于本身来正是的。

  • 和那一个相关的主题是集结类型。在 斯威夫特 2中大家二个用 [AnyObject] 来存放纵何变量,以至于贮存struct类型的StringArray 等。不过按道理
    Swift的 AnyObject 指的是类,而 Any 才是包罗structclassfunc 等全部类型。然则为何 Struct 可以放入 [AnyObject] 呢?在
     Swift 2 的时候会针对StringInt 等 Struct 进行叁个Implicit Bridging Conversions。而到了 Swift
    3
     则进行了贰个**Fully eliminate implicit bridging conversions
    from
    Swift**改动。

  • 当然在自个儿的连串中[AnyObject]实乃细节,最劳碌的正是
    [String:AnyObject]。因为那时写项目标时候,依然处于 OC To
    Swift
     的等级所以对于 Dictionary ,基本选择了 [String:AnyObject],
    所以在匡正的时候,在重重地点为了那个更改。

    • 开局,小编是照着 Xcode 的晋升,在 Dictionary 后面包车型大巴 value
      前边加了贰个 as AnyObjct?

    • 新破壳日益的觉察自身做了后生可畏件很傻比的政工,其实作者就算把
      [String:AnyObject] 改为 [String:Any] 就能够了。????

  • 那也便是为何在第风华正茂混编的品类中自个儿花了那么多时间去修正代码了!得益于混编的第二个品种学习了
    Yep
    的思绪,是把 [String:AnyObject] 命名称叫三个叫做 JSONDictionary 的类型。所以在 Any
    && AnyObect
     那么些业务上,就花了一丢丢时刻。

// Swift 2
 var json = [String:AnyObect]()
json["key1"] = 1 
json["key2"] = "2" 

// to Swift 3 Step 1
 var json = [String:AnyObect]()
json["key1"] = 1 as AnyObject?
json["key2"] = "2" as AnyObject?

// to Swift 3 Step 2
 var json = [String:Any]()
json["key1"] = 1 
json["key2"] = "2"

// Swift 2 
public typealias JSONDictionary = [String: AnyObject]
// To Swift 3 Step 2
public typealias JSONDictionary = [String: Any]

Alamofire 等三方库帮助 iOS8

  • 虽说说自个儿利用的三方库都在第有的时候间将库晋级到了 Swift
    3
     ,然则期中 Alamofire 和 Snap 四个库最低适配只扶植到了
    iOS
    9,为了防止和制品撕逼,必须要想艺术缓和那一个适配难点。上边以 Alamofire  为例

  • 实质上三方库么,不必然只用 Cocoapods
    的。所以希图下载代码然后直接撸源码。

  • Alamofire的 Xcode 订正为压低适配
    8.0,然后编写翻译查找不经过的函数,并剔除。(其实这一个函数都以 iOS 9
    新加的函数,所以删除不影响怎么着。)

  • 或许花了 半个钟头左右就足以删完了,然后直接拖到项目中就能够了~

  • Snap 其实只要拖进去就好了,权且没有需求修改什么。

// 其实都是 !os(watchOS) 这个宏下面的
#if !os(watchOS)

@discardableResult
public func stream(withHostName hostName: String, port: Int) -> StreamRequest {
    return SessionManager.default.stream(withHostName: hostName, port: port)
}

@discardableResult
public func stream(with netService: NetService) -> StreamRequest {
    return SessionManager.default.stream(with: netService)
}

#endif

@escaping

  • 那一个是自家在适配中最蛋疼的坑

  • 先是在看swift-evolution只是询问到@escaping 必得出示注解。然而不晓得@escaping的闭包,在函数体内一点都不大概再改正。

let pedonmeter:CMPedometer = CMPedometer()

    func getPedometerDataFromDate(_ datet:Date?, withHandler handler: @escaping (CMPedometerData?, Error?) -> ()){


        // 编译错误
        pedonmeter.queryPedometerDataFromDate(startTime, toDate:endTime, withHandler: { (pedometerData:CMPedometerData?, error:NSError?) -> Void in

            guard let pedometerData = pedometerData else { return }
            handler(pedometerData, error)

            // 做一些事情

        })
        // 最后逼不得已只能不修改了,函数外面就做一些事情了
        pedonmeter.queryPedometerData(from: startTime, to: endTime, withHandler:  handler as! CMPedometerHandler)

    }

Result of call to ‘funtion’ is unused

  • 那其实不是三个编写翻译错误,可是这么些警报最开首让小编有一点懵逼.重回值不用难道要笔者都改正一下?

  • 最起始实际作者是那般改善的 let _ = funtion(),不过前边在看SE-0047的时候发现@discardableResult也是足以直达那个意义的。

Date && NSDate

  • 因为有个门类中运用的 DateTools 那几个工具。它有贰个 NSDate +
    Tools
     的分类。

  • 而是在写 Swift 3 的历程中自己意识只要变量是 Date
    类型的敬谢不敏接收NSDate + Tools 那些项目,必得出示注明date as
    NSDate
     那样本事调用分类的部分个措施。

  • 那个让使用 OC 的库的时候会以为异常不安适,终究非常多 NS
    的前缀去掉了。全部都来得表明太不团结了。

CAAnimationDelegate

  • 以此实际形似是 Xcode 8 的改换。因为前边CAAnimationDelegate
    是一个分拣。大约申明如下:

@interface NSObject (CAAnimationDelegate)- (void)animationDidStart:(CAAnimation *)anim;
- 
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;@end
  • 事前是在 vc
    中只要重写一下 animationDidStart 函数就足以了。然则新的可怜,开头感觉是
    Swift 3 的更换,但是实际是 Xcode 8 中的改良。将 CAAnimationDelegate
    形成了二个商业事务。作者以为这些校订是为了适配   Swift 3 ?变化如下:

@protocol CAAnimationDelegate @optional- (void)animationDidStart:(CAAnimation *)anim;
- 
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;@end

因为宽度时间比较长,其余的一时想不到了。未完待续吧…

其他

  • 再有超多奇妙的退换令你犹如看不懂这一个语言了,所以提议在适配此前看一下底下的文章。

    • Swift 3
      新特征一览

    • [Swift 3.0 – Released on September 13,
      2016]

    • 还有@卓同学 的 斯维夫特 3
      必需要看类别

  • 再有多少个不错的下结论

    • Swift 3 by 顾

    • 适配 斯维夫特 3
      的一点小经历和坑 by 图拉鼎

总结

  • 总的来讲本次迁徙未有想像中的那么痛心,就算议事原案的更动超大,不过得益于
    Xcode 8
    的搬迁工具,这一次迁徙花销时间非常少,当然也可以有相当大可能率和自家的代码量有涉及~

  • 在搬迁完之后,再看代码,会意识 Swift 越来越古雅了,最少相比于 2
    来说好了众多,至于幸而哪儿?你本人写写不就精通了咯。

  • 末段,终于得以把 Xocde 7
    卸载,再也不用顾虑多个同盟开无脑闪退了!!!

  • 最后对于过年的 Swift 4 只想说 快来吧~分分钟把你消逝!

  • 实则适配之路才刚刚开端,因为 Xcode 8 自动转的代码并不曾很好的 Swift3 化。近年来只是说在 Swift 3 能够编写翻译通过了而已~

更多

行事之余,写了点笔记,固然急需能够在自己的 GitHub 看

作品转自 Damonwong的简书

 

其他值得参照他事他说加以考察文献收藏:

官方:

发表评论

电子邮件地址不会被公开。 必填项已用*标注