這些變化來(lái)自蘋(píng)果官方的喉脖,因?yàn)橛⒄Z(yǔ)水平有限亚隙,翻譯的只是個(gè)大概箫攀,想深入了解的肠牲,可以訪問(wèn)這個(gè)地址:https://swift.org/blog/swift-2-2-new-features/ 那么廢話不多說(shuō),下面來(lái)些硬貨靴跛。
1.編譯時(shí)selector的變化缀雳,swift 2.1的時(shí)候,像下面所示的代碼不會(huì)報(bào)出任何的錯(cuò)誤
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Add, target: self,action: "addNewFireflyRefernce")
}
func addNewFireflyReference() {
gratuitousReferences.append("We should start dealing in black-market beagles.")
}
swift 2.2 中汤求,這樣的定義就會(huì)報(bào)錯(cuò)俏险。在這里严拒,swift 2.2 作出改變的原因扬绪,似乎是官方認(rèn)定,這樣定義一個(gè)字符串使字符串和定義的方法缺乏一種關(guān)聯(lián)性裤唠。那么swift 2.2中的代碼示例如下
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Add, target: self,action: #selector(addNewFireflyRefernce))
}
func addNewFireflyReference() {
gratuitousReferences.append("Curse your sudden but inevitable betrayal!")
}
2.更多的關(guān)鍵字作為函數(shù)的外部參數(shù)名挤牛,swift 2.2 之前,當(dāng)你用到關(guān)鍵字作為參數(shù)名的時(shí)候种蘸,你只能這樣定義:
func visitCity(name: String, `in` state: String) {
print("I'm going to visit \(name) in \(state)")
}
visitCity("Nashville", `in`: "Tennessee")
在swift 2.2 中墓赴,除了inout竞膳,var,let 之外的任何一個(gè)關(guān)鍵字都可以被用作參數(shù)名诫硕,如果在之前的swift項(xiàng)目中坦辟,你使用了這種倒引號(hào)的語(yǔ)法,那么章办,很抱歉锉走,你必須移除它們。現(xiàn)在的話藕届,像下面這樣的代碼是被允許的:
func visitCity(name: String, in state: String) {
print("I'm going to visit \(name) in \(state)")
}
visitCity("Nashville", in: "Tennessee")`
3.元組的比較被加入操作挪蹭。在swift 語(yǔ)言中,元組是一種至關(guān)重要的語(yǔ)言休偶,至少函數(shù)的多返回值的實(shí)現(xiàn)依賴于它梁厉。在swift 2.2給出了比較兩個(gè)元組相等的能力。這也意味著它將會(huì)拿一個(gè)元組的每一個(gè)元素和另一個(gè)元組的每一個(gè)元素進(jìn)行對(duì)比踏兜,如果所有的元素都能匹配上词顾,那么將返回true。例如碱妆,下面的代碼將會(huì)打印NO Match:
let singer = (first: "Taylor", last: "Swift")
let alien = (first: "Justin", last: "Bieber")
if singer == alien {
print("They match! That explains why you never see them together…")
} else {
print("No match.")
}
swift 2.2中计技,只要元組的元素個(gè)數(shù)不超過(guò)6個(gè),元組的比較就能正常的工作山橄。
一個(gè)警告:當(dāng)比較兩個(gè)元組相等的時(shí)候垮媒,它會(huì)忽略元組中元素的名字相等,所以下面的代碼中航棱,singer 和 bird 這兩個(gè)元組是會(huì)被認(rèn)為是相等的:
let singer = (first: "Taylor", last: "Swift")
let bird = (name: "Taylor", breed: "Swift")
if singer == bird {
print("This explains why she sings so well.")
} else {
print("No match.")
}
4.元組表示的語(yǔ)法將會(huì)過(guò)時(shí)睡雇。在和元組表示語(yǔ)法待了不長(zhǎng)的時(shí)間之后,swift 2.2 反對(duì)這一極少被使用的特性饮醇。我在這里提起它只是因?yàn)樗羞@一個(gè)不可思議的名字它抱。在swift 2.1 或者更早的時(shí)候,去使用一個(gè)小心制作的元組來(lái)填充函數(shù)的參數(shù)是可能的朴艰。所以观蓄,假如你有一個(gè)擁有兩個(gè)參數(shù)的函數(shù),那么你便可以用一個(gè)具有2個(gè)滿足函數(shù)參數(shù)類型的元素的元組來(lái)作為參數(shù)調(diào)用函數(shù)祠墅。例如:
func describePerson(name: String, age: Int) {
print("\(name) is \(age) years old")
}
let person = ("Malcolm Reynolds", age: 49)describePerson(person)
5.C語(yǔ)言風(fēng)格的循環(huán)語(yǔ)句將會(huì)過(guò)時(shí)侮穿。盡管swift 擁有一些慣用的循環(huán)方式的選擇,C語(yǔ)言風(fēng)格的循環(huán)方式卻一直是語(yǔ)言的一部分并且被常常使用毁嗦,例如:
for var i = 0; i < 10; i++ {
print(i)
}
這種方式在swift 2.2將會(huì)被反對(duì)并且將會(huì)在swift 3.0中被徹底的移除亲茅。這也朝著再也不用打一個(gè)分號(hào)(;)又邁出了一步
如果你有使用Xcode,你必須把你C語(yǔ)言風(fēng)格的循環(huán)轉(zhuǎn)換為現(xiàn)代的swift的形式。在之前的swift中克锣,會(huì)使用如下所示的范圍的方式來(lái)進(jìn)行循環(huán):
for i in 0 ..< 10 {
print(i)
}
然而茵肃,這種方式的能力是極其有限的,所以我們不得不自己做一些工作袭祟,例如验残,下面的兩個(gè)例子就是上面的轉(zhuǎn)變方式所不能解決的情況:
for var i = 10; i > 0; i-- {
print(i)
}
for var i = 0; i < 10; i += 2 {
print(i)
}
在第一種情況中,你需要使用(1...10).reverse來(lái)創(chuàng)建一個(gè)降序的范圍巾乳。這和你使用10...1的方式是不同的胚膊,倘若你使用上述的方式的話,程序在編譯的時(shí)候?qū)?huì)崩潰想鹰。在第二種情況中紊婉,你應(yīng)該使用stride(to:by:)來(lái)創(chuàng)建一個(gè)循環(huán)。所以辑舷,在swift 2.2 中喻犁,上面兩個(gè)情況的正確的寫(xiě)法為:
for i in (1...10).reverse() {
print(i)
}
for i in 0.stride(to: 10, by: 2) {
print(i)
}
6.++和—是過(guò)時(shí)的。如果你正在使用C語(yǔ)言風(fēng)格來(lái)創(chuàng)建一個(gè)循環(huán)何缓,那么接下來(lái)的改變可能會(huì)令你吃驚肢础。++和—也過(guò)時(shí)了。那么類似for var i = 0; i < 10; i++的操作將包含兩個(gè)過(guò)時(shí)的操作碌廓。盡管swift身處快速的改變的世界传轰,但這樣的改變依然是不同尋常的。你可以用 i += 1 和 i -= 1 來(lái)取代 ++ 和 --的操作谷婆。
7.用var parameters 表示的變量參數(shù)是過(guò)時(shí)的慨蛙。在swift 2.2 之前,如果你想在函數(shù)能不修改傳進(jìn)來(lái)的參數(shù)纪挎,那么你可以用var 給參數(shù)進(jìn)行聲明期贫,例如:
func greet(var name: String) {
name = name.uppercaseString
print("Hello, \(name)!")
}
var name = "Taylor"greet(name)print("After function, name is \(name)")
當(dāng)時(shí),這確實(shí)是一個(gè)有效的快捷方式异袄,但是通砍,這也確實(shí)增加了一些混亂:最后的輸出語(yǔ)句print()將會(huì)輸出“Taylor”還是”TAYLOR”呢?當(dāng)inout這個(gè)關(guān)鍵字出現(xiàn)的時(shí)候烤蜕,這甚至?xí)斐筛蟮幕靵y封孙。所以,使用inout 而不是var讽营,并且添加一個(gè)簡(jiǎn)單的符號(hào)虎忌。代碼如下:
func greet(inout name: String) {
name = name.uppercaseString
print("Hello, \(name)!")
}
var name = "Taylor"greet(&name)print("After function, name is \(name)")
8.重新命名了測(cè)試標(biāo)識(shí)符。__file__ , __line__ , __func__ , __column__
將會(huì)被#file,#line,#func,#column
所取代斑匪。