Swift 2.0 中對語言進行了又一次的改進,這次將整個語言變得更加面向對象化,比如在 Swift 1.x 中如果要判斷某個元素是否在數組中,就需要用到 contains
函數:
if contains(array, value) {
...
}
而在 Swift 2.0
中,contains
被作為 Array
的一方法來使用了。所以我們只需這樣調用即可:
if array.contains(value) {
...
}
這種方式,更加具有面向對象思維。也更符合廣大開發者朋友的習慣~
另外,contains 函數還提供了另外一種參數重載,也可以叫做 predicate
模式,方法簽名如下:
contains(predicate: (Self.Generator.Element) throws -> Bool )
這個方法接受一個閉包類型的參數,這個閉包的作用就是用來判斷某個元素是否符合我們的判斷條件,然后返回相應的 Bool 值。比如這樣:
let numbers = [1,2,3,4,5,6,7];
numbers.contains { (element) -> Bool in
if element % 3 == 0 {
return true
}else {
return false
}
}
上面的代碼中,我們聲明了一個數組,里面包含了 7 個數字,然后我們調用 contains
方法,傳入了一個 predicate
, 里面進行了一個簡單的判斷,如果數組中,有 3 的倍數,就返回 true
。
很顯然,我們的數組中的, 3 和 6 都是符合條件的數字,所以這個 contains
調用的返回值肯定就是 true 了。
這個例子雖然簡單,但展示了 Swift
閉包和語法的靈活性。
接下來,咱們再看一個更貼近我們應用的例子,比如我們在維護一個圖書列表,我們想知道這個列表中有沒有圖書有更新章節,可以用一個簡單的模型來表示圖書:
class Book {
var title:String?
var hasUpdate:Bool = false
init(title:String, hasUpdate:Bool) {
self.title = title
self.hasUpdate = hasUpdate
}
}
然后,我們就可以用 predicate
的方式來直接進行判斷了,不在需要 for
循環了:
var bookList:[Book] = [Book]()
bookList.append(Book(title:"Objective-C", hasUpdate:false))
bookList.append(Book(title:"Cocoa", hasUpdate:false))
bookList.append(Book(title:"Swift", hasUpdate:true))
bookList.contains { (book: Book) -> Bool in
return book.hasUpdate
}