CollectionType过滤器:Swift编译错误:元组模式不能匹配非元组类型的值

时间:2015-09-05 16:04:30

标签: swift closures swift2

假设我们有这个特殊情况

let closestStationAnnotations = closestAnnotations.filter({
    return true
})

我所拥有的地方:

 let closestAnnotations:[MKAnnotation]

使用XCode 7b6,编译器返回:

Tuple pattern cannot match  values of the non-tuple type MKAnnotation

这个错误究竟意味着什么?

PS:对于那些好奇的人来说,这个问题与another I had previously有关。

1 个答案:

答案 0 :(得分:1)

我目睹了Xcode给出的错误消息与实际问题没什么关系的多种情况。在您的特定情况下,真正的问题是,当您使用简写符号(省略块签名)时,您必须使用块内的参数。例如,这会编译,因为在块内部使用了单个块参数$0

let c = closestAnnotations.filter { $0 === $0 }

但是,这不会编译,因为它没有使用块参数:

let c = closestAnnotations.filter { return true }

如果要显式不使用block参数,则必须使用下划线语法告诉编译器:

let c = closestAnnotations.filter { _ in return true }

这种限制有点愚蠢和混乱,并且当您使用带有完整块签名的常规表单时不适用。编译好了:

let c = closestAnnotations.filter { (e: MKAnnotation) -> Bool in
    return true
}