前言:
之前深夜看了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)
// 这样编译器就沉默了, 不报错
接着写了NSNotificationCenter来发布通知, 结果, 习惯性的NS开头但是怎么也没有NSNotificationCenter提示出来, 强制敲出来但是报错, 于是使用NotificationCenter(不得不吐槽为何之前可以,这里不可以)
接着代码如下
let noti = NSNotification(name: "testName" as NSNotification.Name, object: self)
let notiCenter = NotificationCenter.default()
notiCenter.post(noti)
看上去代码应该是没有什么问题的, 不过不过, 这里确实感觉到现在的编译速度快了好多, 立马就报错了
修改之后, 然后注册了通知监听者, 代码是这样的
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代码很少, 还是分享给大家