这些变化来自苹果官方的,因为英语水平有限,翻译的只是个大概,想深入了解的,可以访问这个地址:https://swift.org/blog/swift-2-2-new-features/ 那么废话不多说,下面来些硬货。
1.编译时selector的变化,swift 2.1的时候,像下面所示的代码不会报出任何的错误
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 中,这样的定义就会报错。在这里,swift 2.2 作出改变的原因,似乎是官方认定,这样定义一个字符串使字符串和定义的方法缺乏一种关联性。那么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.更多的关键字作为函数的外部参数名,swift 2.2 之前,当你用到关键字作为参数名的时候,你只能这样定义:
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 之外的任何一个关键字都可以被用作参数名,如果在之前的swift项目中,你使用了这种倒引号的语法,那么,很抱歉,你必须移除它们。现在的话,像下面这样的代码是被允许的:
func visitCity(name: String, in state: String) {
print("I'm going to visit \(name) in \(state)")
}
visitCity("Nashville", in: "Tennessee")`
3.元组的比较被加入操作。在swift 语言中,元组是一种至关重要的语言,至少函数的多返回值的实现依赖于它。在swift 2.2给出了比较两个元组相等的能力。这也意味着它将会拿一个元组的每一个元素和另一个元组的每一个元素进行对比,如果所有的元素都能匹配上,那么将返回true。例如,下面的代码将会打印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中,只要元组的元素个数不超过6个,元组的比较就能正常的工作。
一个警告:当比较两个元组相等的时候,它会忽略元组中元素的名字相等,所以下面的代码中,singer 和 bird 这两个元组是会被认为是相等的:
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.元组表示的语法将会过时。在和元组表示语法待了不长的时间之后,swift 2.2 反对这一极少被使用的特性。我在这里提起它只是因为它有这一个不可思议的名字。在swift 2.1 或者更早的时候,去使用一个小心制作的元组来填充函数的参数是可能的。所以,假如你有一个拥有两个参数的函数,那么你便可以用一个具有2个满足函数参数类型的元素的元组来作为参数调用函数。例如:
func describePerson(name: String, age: Int) {
print("\(name) is \(age) years old")
}
let person = ("Malcolm Reynolds", age: 49)describePerson(person)
5.C语言风格的循环语句将会过时。尽管swift 拥有一些惯用的循环方式的选择,C语言风格的循环方式却一直是语言的一部分并且被常常使用,例如:
for var i = 0; i < 10; i++ {
print(i)
}
这种方式在swift 2.2将会被反对并且将会在swift 3.0中被彻底的移除。这也朝着再也不用打一个分号(;)又迈出了一步
如果你有使用Xcode,你必须把你C语言风格的循环转换为现代的swift的形式。在之前的swift中,会使用如下所示的范围的方式来进行循环:
for i in 0 ..< 10 {
print(i)
}
然而,这种方式的能力是极其有限的,所以我们不得不自己做一些工作,例如,下面的两个例子就是上面的转变方式所不能解决的情况:
for var i = 10; i > 0; i-- {
print(i)
}
for var i = 0; i < 10; i += 2 {
print(i)
}
在第一种情况中,你需要使用(1...10).reverse来创建一个降序的范围。这和你使用10...1的方式是不同的,倘若你使用上述的方式的话,程序在编译的时候将会崩溃。在第二种情况中,你应该使用stride(to:by:)来创建一个循环。所以,在swift 2.2 中,上面两个情况的正确的写法为:
for i in (1...10).reverse() {
print(i)
}
for i in 0.stride(to: 10, by: 2) {
print(i)
}
6.++和—是过时的。如果你正在使用C语言风格来创建一个循环,那么接下来的改变可能会令你吃惊。++和—也过时了。那么类似for var i = 0; i < 10; i++的操作将包含两个过时的操作。尽管swift身处快速的改变的世界,但这样的改变依然是不同寻常的。你可以用 i += 1 和 i -= 1 来取代 ++ 和 --的操作。
7.用var parameters 表示的变量参数是过时的。在swift 2.2 之前,如果你想在函数能不修改传进来的参数,那么你可以用var 给参数进行声明,例如:
func greet(var name: String) {
name = name.uppercaseString
print("Hello, \(name)!")
}
var name = "Taylor"greet(name)print("After function, name is \(name)")
当时,这确实是一个有效的快捷方式,但是,这也确实增加了一些混乱:最后的输出语句print()将会输出“Taylor”还是”TAYLOR”呢?当inout这个关键字出现的时候,这甚至会造成更大的混乱。所以,使用inout 而不是var,并且添加一个简单的符号。代码如下:
func greet(inout name: String) {
name = name.uppercaseString
print("Hello, \(name)!")
}
var name = "Taylor"greet(&name)print("After function, name is \(name)")
8.重新命名了测试标识符。__file__ , __line__ , __func__ , __column__
将会被#file,#line,#func,#column
所取代。