这是Swift编译器错误还是功能? .filter似乎有问题

时间:2019-07-19 21:51:38

标签: swift filter

我认为我遇到了一个Swift Bug,但想在打开外壳之前检查一下。该错误似乎与过滤器函数在计算出完整值之前返回一个布尔值有关。

我现在无法测试旧版本,但是我可以肯定,这在早期的Swift版本中都可以正常工作。

这也可能是由于.filter现在包含“ throws”和“ rethrows”子句。

func filter(_ isIncluded: (Self.Element) throws -> Bool) rethrows -> [Self.Element]

Xcode版本10.2.1(10E1001)和Swift 5.1

下面是问题的多次迭代,但是关键的问题是第15行,除非我在条件的左半边加上“虚假的”括号(按照第12行),否则它将不会编译。

第12行工作正常,但在操场上无法正确显示。值得注意的是,显示的“ false”是闭包的最终迭代的结果(与第5行相同),并且调用了print,但看不到输出。如果if语句更改为多行,则可以查看打印结果。

为了简化代码,我将代码从项目移到了操场上,并注意到由于注释引起的很多奇怪的操场行为,如注释中所述。

这是操场上的代码:

Playground Results and Errors

以下是文本版本:

let arr = [1,2,3,4,0]

//This won't show the value of b in the playground
//It only shows the result of the closure on the last iteration through arr
let b = arr.filter{$0>2}
//This works fine, and we get the display
let d = b
//This works fine
if b.count > 2 { print("Multiple") } else { print("One") }

//This doesn't show the output in a playground
if (arr.filter{$0>2}.count) > 1 { print("Multiple") } else { print("One") }

//This won't compile, having only removed the "spurious" parentheses above
if arr.filter{$0>2}.count > 1 { print("Multiple") } else { print("One") }

0 个答案:

没有答案