我正在观看
this video.在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 } }
当我在Xcode游乐场中键入它时,我收到以下错误:
Initializer for conditional binding must have Optional type,not ‘Int.’
这是为什么?
解决方法
这里的“问题”是声明保护让prime = numbers [i].编译器抱怨它,因为guard let语法要求numbers [i]是一个可选的,它可以有条件地解包.但它不是可选的,你总是可以从数组中检索第i个Int.
修复它只需写
let prime = numbers[i] guard prime > 0 else { continue }
然后正确使用步幅如下(在评论中长时间搜索之后):
for multiple in (2*prime-2).stride(to: n-2,by: 2*prime-2) {
然后最后一块是改变印刷品:
print("\(numbers[i])")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。