我正在使用Swift中的filter()
方法,但遇到了一个我似乎无法在操场上重现的问题。
修改:在此处上传了一个示例项目:https://www.dropbox.com/s/5ce5uyxnpb0mndf/WeirdSwifty.zip?dl=0
我有一个Card
结构,其中包含CardType
枚举:
struct Card {
var name = ""
var type : CardType
enum CardType {
case Red
case Black
}
}
一个Player
类,它维护这些Card
项的数组:
class Player {
var hand : [Card]
init() {
hand = ...
}
func redCards() -> [Card] {
return hand.filter({ (card) -> Bool in
return card.type == .Red
})
}
}
但是,无论我如何尝试格式化此闭包,Xcode都会抛出错误。我甚至让Xcode自动完成闭包签名/正文,认为我有一个语法错误,但它一直在重建它(正确吗?)方式:
我也尝试过编辑Xcode自动生成的内容并提供更简单的版本,但无济于事:
类似地:
正如我所提到的,我无法在一个简单的游乐场示例中重现这一点,但我无法缩小实际导致在我的主项目中的问题。
这是我项目中唯一的错误,如果我注释掉包含filter()
调用的方法,则会正确构建。
这个错误是否是其他一些实际问题的常见问题?
注意:使用Xcode 7.3.1(7D1014)
答案 0 :(得分:18)
Swift的类型推断正在发生一些变化。给card
一个明确的类型,它会起作用。
return hand.filter({ (card: Card) -> Bool in return card.type == .Red })
您不需要退货类型或退货:
return hand.filter({ (card: Card) in card.type == .Red })
注意:这也有效:
return hand.filter({ ($0 as Card).type == .Red })
完全指定.Red
枚举值也可以解决问题:
return hand.filter({ $0.type == Card.CardType.Red })
评论中提到,如果将Card
的定义移动到与过滤器相同的文件中,那么它可以正常工作。实际上,如果您将CardType
枚举的定义从Card
拆分出来,只需将CardType
移动到带过滤器的文件中,就可以了。