Swift 2.2 的新特性

swift 发布于 2017年09月23日
++ 和 -- 操作符被废弃

Swift 2.2 中正式废弃了 ++ 和 -- 这两个操作符,现在如果你在程序中使用这两个操作符,就会收到编译警告。

但这两个操作符存在已久,无论是 C,Java 等主流语言,都存在这两个操作符,那么为什么还要废弃呢?

大体上应该是这样的思路,对于新学习 Swift 人来说,这两个操作符的含义其实不是那么好理解。不如 += 和 -= 表达的更清楚。

另外 ++ 和 -- 操作符主要的应用场景是在 for 循环的标记变量上面,但传统的 for 循环在 Swift 2.2 中也被废弃了。所以它们的应用场景也不存在了。这个咱们下面会讨论。

传统的 C 风格循环也被废弃了

有 C 语言风格程序开发经验的同学可能会比较熟悉这样的 for 循环语句:

for var i = 0; i < 10; i++ {
  print("\(i)")
}

但在 Swift 2.2 中,这段代码就会触发编译警告。也就是说,Swift 是不推荐这种语法的。

我们可以用 Swift 中推荐的循环方式来代替,比如这样:

for i in 0...9 {

  print("\(i)")
}

或者这样:

var array = [0,1,2,3,4,5,6,7,8,9]
for num in array {

  print("\(num)")

}

所以在 Swift 2.2 以后,大家在写循环语句的时候需要注意这一点。

Array 和 Slice 相关的类型添加了一个 removeFirst() 方法

removeFirst 方法可以删除数组的第一个元素,并且把删除的元素作为这个方法的返回值。比如这个数组:

var array = Array(0...9)
array.removeFirst()

Swift 2.2 中添加这个方法也是和之前的 removeLast() 方法的一个对应。但要注意,这个方法不是 Optional 的,也就是说如果对一个空的数组调用这个方法,程序就会崩溃。

元组可以直接进行比较操作了

在之前的 Swift 版本中,元组类型是不能直接用 == 操作符进行比较的,比如这两个元组:

let jobs = ("Steve","Jobs")
let cook = ("Tim","Cook")

在 Swift 2.2 之前,我们直接用 if jobs == cook 这样的方式进行比较,编译器是会报错的。除非我们重载一下 == 操作符:

func == (t1: (T, T), t2:(T, T)) -> Bool {

  return t1.0 == t2.0 && t1.1 == t2.1

}

而在 Swift 2.2 之后,我们可以直接是用 == 操作符对元组进行比较啦。 其实是 Swift 标准库为我们重载了这些操作符。

有一点要注意的是,Swift 2.2 的 == 操作符只能对最多含有 6 个元素的元组进行比较。 这个考虑一个是标准库的复杂度的问题,还有一个是元组的使用场景就是针对含有少数元素的值。如果元素过多,那么还是建议使用 struct 结构来表示了。

Swift 关键字可以作为参数标签

参数标签是 Swift 中一个非常实用的特性。比如这样一个函数:

func greeting(name: String) {

  print("Hello \(name)")

}

这个函数传递一个问候语,参数标签 name,就可以帮助我们很容易的理解出这个参数的含义。在 Swift 2.2 中,对参数标签做了更多加强,比如我们现在可以使用 Swift 关键字作为参数标签名了:

func greeting(name: String, repeat repeatCount:Int) {

    for _ in 0..<repeatCount {

       print("Hello \(name)")

    }

}

repeat 是 Swift 中的关键字,如果这段代码在 Swift 2.2 之前编译,就会报错。但 Swift 2.2 中支持了将这些语言关键字也可以作为参数标签。

将一些调试标识重命名,比如:#line, #function, #file

Swift zhi之前的版本使用了一些特殊符号 __FILE__,__LINE__,__COLUMN__,__FUNCTION__ 来表示一些调试信息。这些符号在编译的时候会被替换成当前的文件名,代码行数,列数量,以及当前标识所在的函数名。

在 Swift 2.2 中这些标示被替换成了 #file,#line,#column,#function。 这个和 Swift 2.0 中引入的 #available 语法更加一致。

新增 #selector 语法

Swift 2.2 终于把 Selector 的使用标准化了。之前 Swift 版本中如果我们要进行 Selector 的相关操作,都是用字符串直接进行,这样就很容易出错:

btn.addTarget(self, action: Selector("buttonClicked"), forControlEvents: UIControlEvents.TouchUpInside)

加入我们将字符串中的 buttonClicked 写成了 buttonCliked, 编译器是不会报出任何错误的,而程序中由于找不到我们误写的 Selector 名称,就会造成程序行为的不正常,并且这种错误一般很难调试。

在 Swift 2.2 中,将这一行为标准化了,现在可以使用 #selector 语法了:

btn.addTarget(self, action: #selector(buttonClicked), forControlEvents: UIControlEvents.TouchUpInside)

现在,如果 #selector 中指定的方法不存在,编译器就会直接报错。增强了代码的安全性。

结尾

以上就是我们对 Swift 2.2 新增特性的总结了。总之 Swift 是一个非常快速更新的语言,强大的开源社区让它变得越来越健壮和强大。


如果你觉得这篇文章有帮助,还可以关注微信公众号 swift-cafe,会有更多我的原创内容分享给你~

本站文章均为原创内容,如需转载请注明出处,谢谢。
关注微信公众号
发现更多精彩
swift-cafe