Swift闭包:无法将类型'(_) - > Bool'的值转换为预期的参数类型

Cra*_*tis 12 xcode swift

我正在使用filter()Swift中的方法,但遇到一个我似乎无法在操场上重现的问题.

编辑:在此处上传了一个示例项目: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
    }
}
Run Code Online (Sandbox Code Playgroud)

还有一个Player维护这些Card项目数组的类:

class Player {
    var hand : [Card]

    init() {
        hand = ...
    }

    func redCards() -> [Card] {
        return hand.filter({ (card) -> Bool in
            return card.type == .Red
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,无论我如何尝试格式化此闭包,Xcode都会抛出错误.我甚至让Xcode自动完成闭包签名/正文,认为我有一个语法错误,但它一直在重建它(正确?)方式:

在此输入图像描述

我也尝试过编辑Xcode自动生成的内容并提供更简单的版本,但无济于事:

在此输入图像描述

同理:

在此输入图像描述

正如我所提到的,我无法在一个简单的游乐场示例中重现这一点,但我无法缩小在我的主项目中实际导致问题的原因.

这是我项目中唯一的错误,如果我注释掉包含filter()调用的方法,它会正确构建.

这个错误是否是其他一些实际问题的常见问题?

注意:使用Xcode 7.3.1(7D1014)

vac*_*ama 19

Swift的类型推断正在发生一些变化.给出card一个明确的类型,它会起作用.

return hand.filter({ (card: Card) -> Bool in return card.type == .Red })
Run Code Online (Sandbox Code Playgroud)

您不需要返回类型或返回:

return hand.filter({ (card: Card) in card.type == .Red })
Run Code Online (Sandbox Code Playgroud)

注意:这也有效:

return hand.filter({ ($0 as Card).type == .Red })
Run Code Online (Sandbox Code Playgroud)

完全指定.Red枚举值也可以解决问题:

return hand.filter({ $0.type == Card.CardType.Red })
Run Code Online (Sandbox Code Playgroud)

在评论中提到,如果将定义移动Card到与过滤器相同的文件中,它就可以工作.实际上,如果你将CardType枚举的定义从中分离出来Card并且只是CardType使用过滤器进入文件,它就可以工作.