迁移程序到swift3.0, 仅列举这四种情况,你是什么感觉??

前言:

之前深夜看了wwdc16的直播, 很大的感受就是: Apple开放了很多的东西, 并且多次提到了China. 期待好久的swift3.0将要来临, 笔者安装了xcode8 beta版想看看swift3.0的模样, 安装好了, 打开之前的一个swift2.3的项目, 编译立马数不清的错(虽然之前有心理准备), 但是当看到很多莫名的错误的时候, 最初的感觉是: 心都凉了. 这里列出四个让大家初识一下变化之大...

1, 首先是: 很多方法只是改了方法的命名方式, 是编译器可以修改的,点击修改可完成更新到最新的语法. 比如

        let offset = panGesture.translationInView(panGesture.view)
        改为
        let offset = panGesture.translation(in: panGesture.view)
        
        系统的枚举改为了小写开头
        eg: UIGestureRecognizerState.changed
    

2, 居然会显示很多重写的方法报不存在的错误(比如: tableView的代理方法...).,着实诧异. 仔细看看才发现, Foundation里面的类名很多被重新修改了(去掉了NS)

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { }
  
  比如这里的NSIndexPath -> 变为了IndexPath
  NSBundle.mainBundle()   -> 变为了 Bundle.main()
  UIColor.redColor() -> UIColor.red()
    

3, 在测试了一下和OC文件的交互上, 发现一点小问题(可能是bug)

  • 首先我在swift项目中新建了一个oc文件, 和之前一样会提示是否建立桥接文件,
    选择建立后, 在桥接文件中引入新建的oc文件的头文件, 编译通过.
  • 在oc文件中我写了一个初始化方法, 然后在swift中使用他来初始化

OCFile

@implementation OCFile
- (instancetype)initWithName:(NSString *)name {
    if (self = [super init]) {
        self.name = name;
        NSLog(@"hello--------%@", self.name);
    }
    return self;
}
@end

swift文件

        let ocfile = OCFile(name: "test")
        view.backgroundColor = UIColor.red()
// 我的天, 下面这行代码报错了, 不过还好编译器有提示, 说是使用了未解包的对象
// 当然, 我们知道在之前的swift2.X中这里的ocfile是可选值(!), 不过我们仍然可以直接这样调用
        print(ocfile.name)
// 在目前的3.0版本中 这里的ocfile是可选值(?), 需要我们处理解包, 比如
        print(octile?.name)

编译, 运行通过, 但是编译器打印了很多信息出来, 这里暂时不管它是什么了
可是运行到oc文件里的NSLog代码处并没有打印信息, 真是欲哭无泪啊
然后我又在xocode7.3里面使用swift写了相同的代码, 运行正常, 有打印信息出来, 不知道这是bug还是什么, 没有找到解决方法

4, 接着我想到在看直播介绍swift的新特性时候提到了OC中的常量string也有改变, 就立马试了试通知NSNotification

首先之前发现Foundation里面的NS被去掉, 但这里习惯性的敲了NS开头, 没成想到, 居然能够敲出NSNotification(又是一阵心碎...), 接着下一行代码

        let noti = NSNotification(name: "testName", object: self)
      // 但是这行代码是报错的, 还好编译器有提示(见下图), 这里也不管为什么是提示的NSString了, 因为就算是报错也应该是提示String ,于是fix了
        let noti = NSNotification(name: "testName" as NSNotification.Name, object: self)
      // 这样编译器就沉默了, 不报错



Snip20160615_22.png

接着写了NSNotificationCenter来发布通知, 结果, 习惯性的NS开头但是怎么也没有NSNotificationCenter提示出来, 强制敲出来但是报错, 于是使用NotificationCenter(不得不吐槽为何之前可以,这里不可以)

Snip20160615_23.png

接着代码如下

        let noti = NSNotification(name: "testName" as NSNotification.Name, object: self)
        let notiCenter = NotificationCenter.default()
        notiCenter.post(noti)

看上去代码应该是没有什么问题的, 不过不过, 这里确实感觉到现在的编译速度快了好多, 立马就报错了

Snip20160615_24.png

修改之后, 然后注册了通知监听者, 代码是这样的

        let noti = NSNotification(name: "testName" as NSNotification.Name, object: self)
        let notiCenter = NotificationCenter.default()
        // 先注册通知监听者
        notiCenter.addObserver(self, selector: #selector(self.testNoti(noti:)), name: "testName" as NSNotification.Name, object: self)

        //延时2s
        sleep(2)
        // 发布通知
        notiCenter.post(noti as Notification)//之前直接使用Notification就没有这样as来转换了
        
        
  // selector是这样的
    func testNoti(noti: Notification) {
        print(noti)
    }

成功运行起来, 并且打印正确, 但是我看到写的将string要转换为
NSNotification.Name,我觉得这不应该是通知的正确使用方式,
还需下来学习.

我只是在短短的时间内, 就发现了很多的改变, 虽然看上去比较麻烦, 但是我相信在适应后, 一定会是很赞赏这些改变的,这里只是列举四点分享给大家, 让大家感觉一下. 后面一段时间, 会一直学习swift3.0的了, 会陆续分享学习心得, 当然期间还是会分享一些其他方面的博客(不过确实需要考虑,以后的短时间内博客是用那个版本的swift来写了, 或者用OC ? ), Demo代码很少, 还是分享给大家

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 因为要结局swift3.0中引用snapKit的问题,看到一篇介绍Xcode8,swift3变化的文章,觉得很详细...
    uniapp阅读 4,467评论 0 12
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,196评论 4 61
  • 曾经被告知:阅读能暂时屏蔽掉呱噪浮夸的世俗 因身心合一的专注 而沉醉 安享知识 文化的熏陶 ... 哎......
    璐狗尔阅读 150评论 1 0
  • 今天路过小区门口时,听到两个大约45岁左右的大姐(虽然可以叫阿姨,但还是礼貌一点好)在谈论打扮和爱美的话题...
    秋之木禾阅读 231评论 0 0
  • 天高云淡,我们一路向西,走过一村一寨。路有多远,心有多远。我们是一群浪迹天涯的游子。 我不期望能遇见多美的风景,让...
    辣江山阅读 299评论 2 3