2015-11-02 307 views
1

swift 2.1語言參考說明for-in循環可以包含where子句。什麼是使用where子句的for-in循環的語義?swift中for-in循環中where子句的語義是什麼?

2.1參考https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Statements.html#//apple_ref/swift/grammar/loop-statement

編輯:要清楚,我要求在一個公開論壇,以便迅速語言的語義可以得到解決。快速參考是不完整的,雖然它的語義可以通過使用代碼來觀察,但爲社區提供文檔來源是最符合社區利益的。

回答

2

下面是你如何使用它兩個簡單的例子。

讓我們假設你有兩個不同的結構地址聲明如下:

struct Address { 
    let country: String? 
} 
struct Person { 
    let name: String 
    let address: Address? 
} 

let people = [ 
    Person(name: "Jack", address: nil), 
    Person(name: "John", address: Address(country: "Finland")), 
    Person(name: "Jill", address: Address(country: "Nepal")) 
] 

對於第一個例子,你可以只匹配像下面一定的標準,其迭代,

for aPerson in people where aPerson.name == "Jack" { 
    print(aPerson) 
} 

請注意,address是一個可選項,您仍然可以使用where子句讓它評估可選項,並僅迭代像這樣的情況,

for aPerson in people where aPerson.address?.country == "Finland" { 
    print(aPerson) 
} 

下面是關於數字等簡單的例子,

let numbers = Array(1...100) 

for number in numbers where number % 2 == 0 { 
    print(number) // prints all even numbers 
} 
1

如果你好奇的語法,一個簡單的例子是:

let numbers = [1, 42, 18, 73, 0] 

for number in numbers where number > 20 { 
    print(number) 
} 

打印:

隨着where條款,當循環,代碼將跳過與子句不匹配的對象。

0

你在問它是如何工作的?它僅對通過條件的值執行代碼塊。

這些做同樣的(有一個例外):

//1 
for value in boolArray.filter({ $0 == true }){ 
    print(value) 
} 

//2 
for value in boolArray where value == true { 
    print(value) 
} 

第二個選項是更快的 - 有多少 - 這取決於你的數據。一些測試之後,第二個選項是相同的:

//3 
for value in boolArray { 
    if value == true { 
     print(value) 
    } 
} 
1

正如你鏈接的頁面上可以看到,語法對換與循環where子句是像這樣:

換的語句→情況選擇模式表達where子句選擇碼塊

所以也可以用它來循環在符合條件的陣列。例如,你可以這樣做:的

for element in array where element.someBoolValue { 
    print(element) 
} 

代替

for element in array { 
    if element.someBoolValue { 
     print(element) 
    } 
} 

另一種方式來顯現它是這樣的:

for element in array.filter({$0.someBoolValue}) { 
    print(element) 
} 

所有這些例子功能相同。

我希望你能理解現在for-in循環如何構造得更好。