前言:
之前深夜看了wwdc16的直播, 很大的感受就是: Apple開(kāi)放了很多的東西, 并且多次提到了China. 期待好久的swift3.0將要來(lái)臨, 筆者安裝了xcode8 beta版想看看swift3.0的模樣, 安裝好了, 打開(kāi)之前的一個(gè)swift2.3的項(xiàng)目, 編譯立馬數(shù)不清的錯(cuò)(雖然之前有心理準(zhǔn)備), 但是當(dāng)看到很多莫名的錯(cuò)誤的時(shí)候, 最初的感覺(jué)是: 心都涼了. 這里列出四個(gè)讓大家初識(shí)一下變化之大...
1, 首先是: 很多方法只是改了方法的命名方式, 是編譯器可以修改的,點(diǎn)擊修改可完成更新到最新的語(yǔ)法. 比如
let offset = panGesture.translationInView(panGesture.view)
改為
let offset = panGesture.translation(in: panGesture.view)
系統(tǒng)的枚舉改為了小寫(xiě)開(kāi)頭
eg: UIGestureRecognizerState.changed
2, 居然會(huì)顯示很多重寫(xiě)的方法報(bào)不存在的錯(cuò)誤(比如: tableView的代理方法...).,著實(shí)詫異. 仔細(xì)看看才發(fā)現(xiàn), Foundation里面的類(lèi)名很多被重新修改了(去掉了NS)
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { }
比如這里的NSIndexPath -> 變?yōu)榱薎ndexPath
NSBundle.mainBundle() -> 變?yōu)榱?Bundle.main()
UIColor.redColor() -> UIColor.red()
3, 在測(cè)試了一下和OC文件的交互上, 發(fā)現(xiàn)一點(diǎn)小問(wèn)題(可能是bug)
- 首先我在swift項(xiàng)目中新建了一個(gè)oc文件, 和之前一樣會(huì)提示是否建立橋接文件,
選擇建立后, 在橋接文件中引入新建的oc文件的頭文件, 編譯通過(guò). - 在oc文件中我寫(xiě)了一個(gè)初始化方法, 然后在swift中使用他來(lái)初始化
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()
// 我的天, 下面這行代碼報(bào)錯(cuò)了, 不過(guò)還好編譯器有提示, 說(shuō)是使用了未解包的對(duì)象
// 當(dāng)然, 我們知道在之前的swift2.X中這里的ocfile是可選值(!), 不過(guò)我們?nèi)匀豢梢灾苯舆@樣調(diào)用
print(ocfile.name)
// 在目前的3.0版本中 這里的ocfile是可選值(?), 需要我們處理解包, 比如
print(octile?.name)
編譯, 運(yùn)行通過(guò), 但是編譯器打印了很多信息出來(lái), 這里暫時(shí)不管它是什么了
可是運(yùn)行到oc文件里的NSLog代碼處并沒(méi)有打印信息, 真是欲哭無(wú)淚啊
然后我又在xocode7.3里面使用swift寫(xiě)了相同的代碼, 運(yùn)行正常, 有打印信息出來(lái), 不知道這是bug還是什么, 沒(méi)有找到解決方法
4, 接著我想到在看直播介紹swift的新特性時(shí)候提到了OC中的常量string也有改變, 就立馬試了試通知NSNotification
首先之前發(fā)現(xiàn)Foundation里面的NS被去掉, 但這里習(xí)慣性的敲了NS開(kāi)頭, 沒(méi)成想到, 居然能夠敲出NSNotification(又是一陣心碎...), 接著下一行代碼
let noti = NSNotification(name: "testName", object: self)
// 但是這行代碼是報(bào)錯(cuò)的, 還好編譯器有提示(見(jiàn)下圖), 這里也不管為什么是提示的NSString了, 因?yàn)榫退闶菆?bào)錯(cuò)也應(yīng)該是提示String ,于是fix了
let noti = NSNotification(name: "testName" as NSNotification.Name, object: self)
// 這樣編譯器就沉默了, 不報(bào)錯(cuò)
接著寫(xiě)了NSNotificationCenter來(lái)發(fā)布通知, 結(jié)果, 習(xí)慣性的NS開(kāi)頭但是怎么也沒(méi)有NSNotificationCenter提示出來(lái), 強(qiáng)制敲出來(lái)但是報(bào)錯(cuò), 于是使用NotificationCenter(不得不吐槽為何之前可以,這里不可以)
接著代碼如下
let noti = NSNotification(name: "testName" as NSNotification.Name, object: self)
let notiCenter = NotificationCenter.default()
notiCenter.post(noti)
看上去代碼應(yīng)該是沒(méi)有什么問(wèn)題的, 不過(guò)不過(guò), 這里確實(shí)感覺(jué)到現(xiàn)在的編譯速度快了好多, 立馬就報(bào)錯(cuò)了
修改之后, 然后注冊(cè)了通知監(jiān)聽(tīng)者, 代碼是這樣的
let noti = NSNotification(name: "testName" as NSNotification.Name, object: self)
let notiCenter = NotificationCenter.default()
// 先注冊(cè)通知監(jiān)聽(tīng)者
notiCenter.addObserver(self, selector: #selector(self.testNoti(noti:)), name: "testName" as NSNotification.Name, object: self)
//延時(shí)2s
sleep(2)
// 發(fā)布通知
notiCenter.post(noti as Notification)//之前直接使用Notification就沒(méi)有這樣as來(lái)轉(zhuǎn)換了
// selector是這樣的
func testNoti(noti: Notification) {
print(noti)
}
成功運(yùn)行起來(lái), 并且打印正確, 但是我看到寫(xiě)的將string要轉(zhuǎn)換為
NSNotification.Name,我覺(jué)得這不應(yīng)該是通知的正確使用方式,
還需下來(lái)學(xué)習(xí).
我只是在短短的時(shí)間內(nèi), 就發(fā)現(xiàn)了很多的改變, 雖然看上去比較麻煩, 但是我相信在適應(yīng)后, 一定會(huì)是很贊賞這些改變的,這里只是列舉四點(diǎn)分享給大家, 讓大家感覺(jué)一下. 后面一段時(shí)間, 會(huì)一直學(xué)習(xí)swift3.0的了, 會(huì)陸續(xù)分享學(xué)習(xí)心得, 當(dāng)然期間還是會(huì)分享一些其他方面的博客(不過(guò)確實(shí)需要考慮,以后的短時(shí)間內(nèi)博客是用那個(gè)版本的swift來(lái)寫(xiě)了, 或者用OC ? ), Demo代碼很少, 還是分享給大家