Swift2.2 迁移到 Swift3 指南

以下是迁移公司项目代码至Swift3的时,遇到较多的问题的一个总结.

1.首当其冲的就是闭包的修改。

升级完Xcode8之后根据提示会默认帮你进行一些修改。但是修改完成还有500+多个错误很大一部分是闭包的修改,我的内心是这样的。

why???

在Swift2.3中我们写闭包是这样写:

    //Swift 2.2
    typealias detailCollectBlock = (state:Bool)->Void
    
    var detailCollect:detailCollectBlock?
    
    func detailCollect(detailCollect:detailCollectBlock)
    {
        self.detailCollect = detailCollect
    }

    //在需要的时候调用
    self.detailCollect?(state:true)
    
    //
    controller.detailPraise({ (state) in
        model.isPraise = (state ? "1" : "0")
            })
    //Swift3中的 使用方法1 
    typealias detailCollectBlock = (Bool)->Void
    
    var detailCollect:detailCollectBlock?
    
    func detailCollect(detailCollect:@escaping detailCollectBlock)
    {
        self.detailCollect = detailCollect
    }
    //在需要的时候调用
    self.detailCollect?(true)
    
    //在上页面回调接收的时候的用法
    controller.detailPraise(detailPraise: { (<#Bool#>) in
         model.isPraise = (state ? "1" : "0")
            })
            
    //使用方法2
    typealias detailCollectBlock = (_ state:Bool)->Void
    
    var detailCollect:detailCollectBlock?
    
    func detailCollect(_ detailCollect:@escaping detailCollectBlock)
    {
        self.detailCollect = detailCollect
    }

    //在需要的时候调用
    self.detailCollect?(state:true)
    
    //
    controller.detailPraise({ (state) in
        model.isPraise = (state ? "1" : "0")
            })

这个时候大家应该就可以从代码中发现,swift3中需要定义闭包的时候不需要命名参数名,只需要告诉参数类型即可.

现在迁移我们也可以使用方法2,这时我们的参数在使用时还是省略的(就和2.2时使用相同),外部调用闭包的时候就不需要在修改了。这样可以减少很多工作量,因为项目中的闭包实在是太多了..

如果闭包不是在当前作用域内执行而是还要继续传递到别的函数里的话, 那就必须加上@escaping,本身的意思是逃逸的

别接收回调的地方也和swift2.2不同,回调方法中会有block的名字,但是没有参数名了(方法2中就没有名字啦),只有参数的类型,我们需要自己来定义参数的名称.

详情见<a href="https://github.com/apple/swift-evolution/blob/master/proposals/0103-make-noescape-default.md">SE-0103</a>和<a href="https://github.com/apple/swift-evolution/blob/master/proposals/0118-closure-parameter-names-and-labels.md">SE-0118</a>

2.在Swift2.3中我们函数在被调用时的第一个参数名会被省略,除非在前面在此定义eq:

//这样才会在调用的时候显示参数名 swift2.2时
func addCollect(detailId detailId)

在Swift3中我们不需要在这样做了。会一直带有第一个参数名

3.UIControlState等的表示状态的常量 都变成了首字母小写

//Swift2.2
self.toolsView?.praiseButton.setImage(UIImage.init(named: "tool_icon_like_normal"), forState: .Normal)

self.phone?.componentsSeparatedByString() //swift2.2

//swift3
self.toolsView?.praiseButton.setImage(UIImage.init(named: "tool_icon_like_normal"), for: .normal)

self.phone?.components(separatedBy: "-") //swift3

这样做也是为了脱离OC冗长的方法命名,精简了语意,但是可读性还需要长时间的检验吧

3.使用NSDictionary的修改

dict.setObject(true, forKey: "state")
dict.setObject(num, forKey: "key")

在之前我们一直使用NSDictionary(~~<font color=gray>因为从OC转过来感觉还是NSarray和NSDictionary用起来顺手的</font> ),用来设置key的时候。现在需要添加NSCopying ,所以我都改成Dictionary啦哈哈。现在我们也应该在之后写代码的时候避免使用NSString,NSArray, NSDictionary等因为现在更加不方便了

4.泛型

//swift2.2
 var selectResult:PHFetchResult?
 
//swift3
 var selectResult:PHFetchResult<PHAsset>?

这个是项目中图片管理器所用到的,现在就是需要在PHFetchResult后面告诉它是什么类型,也可以是AnyObject
这个后面还需要详细的介绍。给自己挖个坑

5.没有了CGRectMake 改用CGRect.init来初始化或者我们写一个他的扩展.来模拟之前的CGRectmake

//用来代替,修改的CGRectMake
func CGRectMake(_ x:CGFloat,_ y:CGFloat,_ width:CGFloat,_ height:CGFloat)->CGRect
{
    return CGRect.init(x: x, y: y, width: width, height: height)
}

6.关于颜色的初始化方法UIColor.color都去掉了括号,并且color的后缀页去掉了,新添加了Url类,也是为了脱离OC的NSUrl吧.

7.GCD的改变 更加Swift化.

DispatchQueue.main.async {
    let controller = LoginViewController()
    self.present(controller, animated: true, completion: nil)
                }

其实GCD的用法没有太多的改变,只是写法变的更加Swift,去掉了之前C语言的形式,多写读多熟悉应该就好了。

9.NSString操作的变化

//swift2.2
   let ch = (pinYinString as NSString).character(at: 0)
//swift3
    let ch=pinYinString?.unicodeScalars[(pinYinString?.unicodeScalars.startIndex)!]

因为我需要取到拼音的首字母来进行排序,所以需要获取到首字母的ASCII码。所以使用NSString更方便。但是现在不能这样用了,所以我们只能使用Swift中的这个unicodeScalars来获取啦。

8.枚举变成了小写,自己定义的时候是大写当他变成.语法的时候Xcode页把它变成了小写

<p></p>
以上只列举去我在修改项目时所遇到的较多次的问题,现在项目还没有修改完,只是修改了一大部分(其实没有什么很难修改的问题,只是修改的地方太多,工作量较大),我也会在接下来更新遇到较多的问题~~

可以下载我们的APP茶虫使用一下呦~

Thanks.png

更多Swift3的改动详情请阅读Swift官方博客Swift3中文文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容