swift中for-in循环中where子句的语义是什么?

时间:2015-11-02 21:42:32

标签: swift

swift 2.1语言参考说明for-in循环可以包含where子句。使用where子句的for-in循环的语义是什么?

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

编辑:要明确我在公共论坛上提问,以便可以解决快速语言的语义问题。 swift引用是不完整的,虽然可以通过使用代码来观察其语义,但是为社区提供有关其行为的文档来源符合社区的最佳利益。

4 个答案:

答案 0 :(得分: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 :(得分:1)

如果您对语法感到好奇,可以使用一个简单的例子:

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

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

打印:

  

42
  73

使用where子句,在循环时,代码将跳过与子句不匹配的对象。

答案 2 :(得分:1)

从您链接的页面可以看出,带有where子句的for-in循环的语法是这样的:

  

for-in-statement→ for case opt pattern in expression where-clause opt 代码块

因此,您可以使用它来循环具有条件的数组。例如,您可以这样做:

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循环。

答案 3 :(得分:0)

您是否在询问它是如何运作的?它只对通过where where的值执行代码块。

这些做同样的事情(有一个例外):

//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)
    }
}