警卫让swift 2.0游乐场获取有关可选绑定的错误...为什么?

Dav*_*man 5 xcode let ios swift

我在看这个视频.在9:40左右,屏幕上有一些示例代码,如下面的代码:

//Sieve of Eratosthenes, as seen in WWDC 2015

func primes(n: Int) -> [Int] {
var numbers = [Int](2..<n)
for i in 0..<n-2 {
    guard let prime = numbers[i] where prime > 0 else { continue }
      for multiple in stride(from: 2 * prime-2, to: n-2, by: prime) {
        numbers[multiple] = 0
        print("\"numbers[i]")
      }

    }
return numbers.filter { $0 > 0 }
}
Run Code Online (Sandbox Code Playgroud)

当我在Xcode游乐场中键入它时,我收到以下错误:

条件绑定的初始化程序必须具有可选类型,而不是'Int.'

这是为什么?

luk*_*302 2

这里的“问题”是陈述guard let prime = numbers[i]。编译器会抱怨它,因为guard let语法期望numbers[i]它是一个可以有条件解包的可选值。但这不是一个可选的,你总是能够Int从数组中检索第 i 个。

要修复它,只需写

let prime = numbers[i]
guard prime > 0 else { continue }
Run Code Online (Sandbox Code Playgroud)

then的正确用法stride如下所示(在评论中进行了长时间的搜索后):

for multiple in (2*prime-2).stride(to: n-2, by: 2*prime-2) {
Run Code Online (Sandbox Code Playgroud)

然后最后一步是改变print

print("\(numbers[i])")
Run Code Online (Sandbox Code Playgroud)