前言:
之前深夜看了wwdc16的直播, 很大的感受就是: Apple開放了很多的東西, 并且多次提到了China. 期待好久的swift3.0將要來臨, 筆者安裝了xcode8 beta版想看看swift3.0的模樣, 安裝好了, 打開之前的一個swift2.3的項目, 編譯立馬數(shù)不清的錯(雖然之前有心理準(zhǔn)備), 但是當(dāng)看到很多莫名的錯誤的時候, 最初的感覺是: 心都涼了. 這里列出四個讓大家初識一下變化之大...
1, 首先是: 很多方法只是改了方法的命名方式, 是編譯器可以修改的,點擊修改可完成更新到最新的語法. 比如
let offset = panGesture.translationInView(panGesture.view)
改為
let offset = panGesture.translation(in: panGesture.view)
系統(tǒng)的枚舉改為了小寫開頭
eg: UIGestureRecognizerState.changed
2, 居然會顯示很多重寫的方法報不存在的錯誤(比如: tableView的代理方法...).,著實詫異. 仔細看看才發(fā)現(xiàn), Foundation里面的類名很多被重新修改了(去掉了NS)
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { }
比如這里的NSIndexPath -> 變?yōu)榱薎ndexPath
NSBundle.mainBundle() -> 變?yōu)榱?Bundle.main()
UIColor.redColor() -> UIColor.red()
3, 在測試了一下和OC文件的交互上, 發(fā)現(xiàn)一點小問題(可能是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()
// 我的天, 下面這行代碼報錯了, 不過還好編譯器有提示, 說是使用了未解包的對象
// 當(dāng)然, 我們知道在之前的swift2.X中這里的ocfile是可選值(!), 不過我們?nèi)匀豢梢灾苯舆@樣調(diào)用
print(ocfile.name)
// 在目前的3.0版本中 這里的ocfile是可選值(?), 需要我們處理解包, 比如
print(octile?.name)
編譯, 運行通過, 但是編譯器打印了很多信息出來, 這里暫時不管它是什么了
可是運行到oc文件里的NSLog代碼處并沒有打印信息, 真是欲哭無淚啊
然后我又在xocode7.3里面使用swift寫了相同的代碼, 運行正常, 有打印信息出來, 不知道這是bug還是什么, 沒有找到解決方法
4, 接著我想到在看直播介紹swift的新特性時候提到了OC中的常量string也有改變, 就立馬試了試通知NSNotification
首先之前發(fā)現(xiàn)Foundation里面的NS被去掉, 但這里習(xí)慣性的敲了NS開頭, 沒成想到, 居然能夠敲出NSNotification(又是一陣心碎...), 接著下一行代碼
let noti = NSNotification(name: "testName", object: self)
// 但是這行代碼是報錯的, 還好編譯器有提示(見下圖), 這里也不管為什么是提示的NSString了, 因為就算是報錯也應(yīng)該是提示String ,于是fix了
let noti = NSNotification(name: "testName" as NSNotification.Name, object: self)
// 這樣編譯器就沉默了, 不報錯

接著寫了NSNotificationCenter來發(fā)布通知, 結(jié)果, 習(xí)慣性的NS開頭但是怎么也沒有NSNotificationCenter提示出來, 強制敲出來但是報錯, 于是使用NotificationCenter(不得不吐槽為何之前可以,這里不可以)

接著代碼如下
let noti = NSNotification(name: "testName" as NSNotification.Name, object: self)
let notiCenter = NotificationCenter.default()
notiCenter.post(noti)
看上去代碼應(yīng)該是沒有什么問題的, 不過不過, 這里確實感覺到現(xiàn)在的編譯速度快了好多, 立馬就報錯了

修改之后, 然后注冊了通知監(jiān)聽者, 代碼是這樣的
let noti = NSNotification(name: "testName" as NSNotification.Name, object: self)
let notiCenter = NotificationCenter.default()
// 先注冊通知監(jiān)聽者
notiCenter.addObserver(self, selector: #selector(self.testNoti(noti:)), name: "testName" as NSNotification.Name, object: self)
//延時2s
sleep(2)
// 發(fā)布通知
notiCenter.post(noti as Notification)//之前直接使用Notification就沒有這樣as來轉(zhuǎn)換了
// selector是這樣的
func testNoti(noti: Notification) {
print(noti)
}
成功運行起來, 并且打印正確, 但是我看到寫的將string要轉(zhuǎn)換為
NSNotification.Name,我覺得這不應(yīng)該是通知的正確使用方式,
還需下來學(xué)習(xí).
我只是在短短的時間內(nèi), 就發(fā)現(xiàn)了很多的改變, 雖然看上去比較麻煩, 但是我相信在適應(yīng)后, 一定會是很贊賞這些改變的,這里只是列舉四點分享給大家, 讓大家感覺一下. 后面一段時間, 會一直學(xué)習(xí)swift3.0的了, 會陸續(xù)分享學(xué)習(xí)心得, 當(dāng)然期間還是會分享一些其他方面的博客(不過確實需要考慮,以后的短時間內(nèi)博客是用那個版本的swift來寫了, 或者用OC ? ), Demo代碼很少, 還是分享給大家