Swift3.0中的新改變

前言

在WWDC2016中Swift3.0發(fā)布,在大會(huì)中官方也提到了很多關(guān)于Swift的新改變和突破,接下來(lái)我們來(lái)了解一下一些新改變.

本章主要是了解一些在實(shí)際開(kāi)發(fā)中需要用到的方法或者函數(shù),我使用的是Xcode8測(cè)試版, 在測(cè)試版中有很多坑,比如:打開(kāi)自己以前的Swift項(xiàng)目,就會(huì)報(bào)幾百個(gè)錯(cuò)誤,這些都是語(yǔ)法上的錯(cuò)誤,因?yàn)樵赟wift3.0中的語(yǔ)法和之前版本的Swift有很大的出入, 根據(jù)它的提示,將原來(lái)的語(yǔ)法,變成Swift3.0的語(yǔ)法,然后save即可.

Swift3.0 有什么改變呢?

(一), 函數(shù)或方法參數(shù)有變動(dòng)

  • 在Swift3.0之前, 方法的參數(shù)的名稱默認(rèn)第0個(gè)是省略的,也就是說(shuō)在第1個(gè)參數(shù)時(shí)才會(huì)有名稱
    Swift3.0必須每個(gè)參數(shù)都需要指明參數(shù)的名稱, 當(dāng)然我們可以使用"_"來(lái)修飾參數(shù),說(shuō)明在調(diào)用的時(shí)候可以省略
 // 以前的做法
 func sum (mun1: Int, num2: Int) -> Int { return num1 + num2 }  // 方法
 sum( 15, num2: 15) // 調(diào)用方法
 
 // swift3.0的做法
 func sum (mun1: Int, num2: Int) -> Int { return num1 + num2 }  // 方法
 sum( num: 15, num2: 15) // 調(diào)用方法

(二), 取消了var參數(shù),原因是和inout沖突了

  • 1, 以前在方法中將參數(shù)設(shè)置為變量時(shí),只需要在變量前設(shè)置為var即可,但是在Swift3.0中就會(huì)報(bào)錯(cuò), 不能直接在方法中使用var來(lái)設(shè)置變量
// 在Swift3.0之前
 func increase (var a: Int) {
    
     a += 1
 }
 
 // swift3.0
 func increase ( a: Int) {
 
 var a = a
 a += 1
 }
  • 2, 雖然在方法或者函數(shù)中不能使用var,但是可以使用inout, 但是,這里有一個(gè)細(xì)節(jié), 就是inout的位置
 例如:
 // 在Swift3.0之前
 func increase (inout a: Int) {
     a += 1
 }
 
 // 在Swift3.0之后就不能這樣了
 func increase (a: inout Int) {
    a += 1
 }

(三), 在Swift3.0中方法的返回值必須要有接收,否則就會(huì)報(bào)警告或者報(bào)錯(cuò),主要的目的就是提醒開(kāi)發(fā)者需要接收方法的返回值,當(dāng)我們不需要接收返回值時(shí),我們有兩種方法告訴編譯器此方法可以不用接收方法的返回值

override func viewDidLoad() {
 super.viewDidLoad()
 
 方式一: 需要@discardableResult
 let ca = function()
 ca.sum(a: 10, b: 10) // 這里會(huì)有一個(gè)警告,提示開(kāi)發(fā)者需要接收返回值
 
 方式二: 不需要@discardableResult
 let _ = ca.sum(a: 10, b:10)
 
 }
 
 struct function {
 
 @discardableResult
 func sum(a: Int, b: Int) -> Int {
 return a + b
    }
 }

注意這里我們使用了struct, 我們來(lái)看看它和Class的區(qū)別
在Swift中struct與Class非常相似, 但是他們還是有點(diǎn)區(qū)別的
區(qū)別一: struct沒(méi)有繼承功能,但是class是可以繼承的
區(qū)別二: 區(qū)別體現(xiàn)在內(nèi)存上, struct是通過(guò)值傳遞的,而class是通過(guò)引用來(lái)傳遞的.

(四), 可選類(lèi)型上的變化

  • 在Swift3.0開(kāi)始可選類(lèi)型就更加的嚴(yán)格了, 隱式的可選類(lèi)型和其他類(lèi)型的運(yùn)算之后所得到的是可選類(lèi)型,而不是隱式類(lèi)型
 let a: Int! = 1
 let b = a + 1  // b是Int類(lèi)型
 let c = a   // c是Int?類(lèi)型
 
 print("b的值是\(b), c的值\(c)")

(五), 自定義代理協(xié)議時(shí),也有一點(diǎn)變化

  • 在Swift3.0之前,定義協(xié)議只需要在協(xié)議(protocol)前面添加@objc即可,但是在Swict3.0中定義協(xié)議除了在協(xié)議前面加@objc外,在協(xié)議中的方法的修飾符前也要加@objc
 @objc pritocol SinaHomeDelegate {
 
    @objc optional func func1()
    func func2()
 }
 

(六), 在Swift3.0中移除了"++","--"兩種自增或自減兩種操作符

// 在swift3.0之前
 var a = 1
 a++  // 在舊版的Swift中這是可以的,但是在Swift3.0之后就會(huì)報(bào)錯(cuò),不能這樣寫(xiě)了
 
 // 在Swift3.0之后
 只能寫(xiě)成 var b = 1
 b = b + 1 或者 b += 1(建議寫(xiě)法)

(七), 取消了C語(yǔ)言中的for循環(huán)風(fēng)格


// 在舊版的Swift中 for循環(huán)可以寫(xiě)成這種:
 for i = 0; i < 10; i += 1 {
 
     print(i)
 }
 
 // 但是在Swift3.0中不能這樣寫(xiě),這樣會(huì)報(bào)錯(cuò), 原因是在新版的Swift中已經(jīng)移除了這種C語(yǔ)言樣式的寫(xiě)法
 for i in 0..<10 {
    pring(i)
 }  // 正確寫(xiě)法

(八), SDK類(lèi)中的變化

  • 在以前的Swift中,很多方法或者函數(shù)都和OC很像,所以對(duì)很多OC開(kāi)發(fā)者來(lái)說(shuō),上手很容易,但是在Swift3.0后,徹底改變了
    這種情況,原因是這樣可以消除函數(shù)又長(zhǎng)又臭的缺點(diǎn), 比如說(shuō): 消除了類(lèi)型前綴,方法名去重, 函數(shù)和方法去C風(fēng)格
// 1, 去掉類(lèi)型前綴
 let url = URL(string:"www.baidu.com")  // 以前的NSURL變成了URL
 let data = Data()  // 以前的寫(xiě)法: let data = NSData(),顯然現(xiàn)在的更加簡(jiǎn)潔
 
 // 2, 可讀性更好了
 let isFileURL = url?.isFileURL // 以前的寫(xiě)法是url?.fileURL, 現(xiàn)在的寫(xiě)法可讀性更好了
 
 // 3, 移除多余的動(dòng)詞,其他名詞,介詞修飾語(yǔ),顯然這樣更加簡(jiǎn)單,簡(jiǎn)潔,易讀
 var array = [1, 2, 3, 4]
 array.append(contentsOf: [4, 5, 6])  // 以前的寫(xiě)法: array.appendContentsOf([4, 5, 6])
 array.remove(at: 0) // 以前的寫(xiě)法: array.removeAtIndex(0)
 
 // 4, 在Swift3.0中盡量消除重復(fù),可以減少語(yǔ)義歧義
 例如: 
 btn.backgroundColor = UIColor.red()  // 以前的寫(xiě)法: btn.backgroundColor = UIColor.redColor()
 
 // 5,枚舉的成員首字母變成了小寫(xiě)
 label.textAlignment = .center  // 以前的寫(xiě)法: label.textAlignment = .Center
 
 // 如果按鈕的狀態(tài)是普通狀態(tài)時(shí),normal可以省略變?yōu)?)
 
 let btn = UIButton()
 btn.setTitle("按鈕", for: UIControlState()) // Nomal狀態(tài)可以省略Normal
 btn.frame = CGRect(x: 100, y: 100, width: 50, height: 50)  // 不在是CGRectMake....
 btn.backgroundColor = UIColor.red()   // 不在是redColor()
 view.addSubview(btn)

(九), 去C風(fēng)格后,易讀性更好


 // 1, 設(shè)置控件的frame
 btn.frame = CGRect(x: 0, y: 0, width: 50, height: 50)  // 以前的寫(xiě)法: CGRectMake(0, 0, 50, 50)
 
 // 2, 語(yǔ)法簡(jiǎn)短易讀
 if let context =
 
 // 3. GCD的使用也有變化
 
 // Swift3.0之前的寫(xiě)法是:
 let queue = dispatch_queue_create("myQueue", nil)
 dispatch_async(queue) {  // 異步執(zhí)行queue隊(duì)列中的函數(shù)
 
    // 執(zhí)行閉包中的方法
    pringt("以前的寫(xiě)法")
 }
 
 // Swift3.0后的寫(xiě)法, 更加簡(jiǎn)潔,易讀
 let queue = DispatchQueue(label: "myQueue")
 queue.async {
 
 // 執(zhí)行異步函數(shù)
 print("hello Swift3.0")
 }

 // 4, 某些相關(guān)的常量定義被移動(dòng)到了枚舉內(nèi)部,比如說(shuō)通知的名稱
 
 // 4.1, Swift3.0中的通知?jiǎng)?chuàng)建
 
 NotificationCenter.default.addObserver(self, selector: #selector(loadDatas()), name: UserDefaults.didChangeNotification, object: nil)
 

 
 
 // 但是在Swift3.0之前不是這樣的(區(qū)別在與通知名)
 old:NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(loadDatas()), name: NSUserDefaultsDidChangeNotification, object: nil)

(十), 新的浮點(diǎn)型協(xié)議, Float, Double, CGFloat使用了新的協(xié)議,主要是提供了IEEE-754標(biāo)準(zhǔn)的屬性和方法

 let a = 2 * Float.pi  // 以前的寫(xiě)法: let a = 2 * M_PI
 // 上面的寫(xiě)法可能還沒(méi)有以前的寫(xiě)法好讀好看,所以下面這種寫(xiě)法是推薦寫(xiě)法,簡(jiǎn)潔易讀
 let a = 2.0 * .pi  // 這樣的寫(xiě)法主要是取決于前面的是否是浮點(diǎn)類(lèi)型, 如果是后面的Float可以省
 
 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末寝受,一起剝皮案震驚了整個(gè)濱河市坷牛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌很澄,老刑警劉巖京闰,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颜及,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蹂楣,警方通過(guò)查閱死者的電腦和手機(jī)俏站,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)痊土,“玉大人肄扎,你說(shuō)我怎么就攤上這事×拊停” “怎么了犯祠?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)酌呆。 經(jīng)常有香客問(wèn)我衡载,道長(zhǎng),這世上最難降的妖魔是什么隙袁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任痰娱,我火速辦了婚禮,結(jié)果婚禮上菩收,老公的妹妹穿的比我還像新娘梨睁。我一直安慰自己,他們只是感情好坛梁,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布而姐。 她就那樣靜靜地躺著腊凶,像睡著了一般划咐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钧萍,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天褐缠,我揣著相機(jī)與錄音,去河邊找鬼风瘦。 笑死队魏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的万搔。 我是一名探鬼主播胡桨,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼瞬雹!你這毒婦竟也來(lái)了昧谊?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤酗捌,失蹤者是張志新(化名)和其女友劉穎呢诬,沒(méi)想到半個(gè)月后涌哲,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尚镰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年阀圾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狗唉。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡初烘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出敞曹,到底是詐尸還是另有隱情账月,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布澳迫,位于F島的核電站局齿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏橄登。R本人自食惡果不足惜抓歼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拢锹。 院中可真熱鬧谣妻,春花似錦、人聲如沸卒稳。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)充坑。三九已至减江,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捻爷,已是汗流浹背辈灼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留也榄,地道東北人巡莹。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像甜紫,于是被迫代替她去往敵國(guó)和親降宅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容