xcode – Swift闭包:不能将类型'(_) – > Bool’的值转换为预期的参数类型

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

编辑:在这里上传一个示例项目:https://www.dropbox.com/s/5ce5uyxnpb0mndf/WeirdSwifty.zip?dl=0

我有一个包含CardType枚举的卡结构:

struct Card {
    var name = ""
    var type : CardType

    enum CardType {
        case Red
        case Black
    }
}

一个保持这些卡项目数组的Player类:

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)

解决方法

一些闪闪发光的东西正在用Swift的类型推断.给卡一个明确的类型,它将工作.
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 })

评论中提到,如果您将卡的定义移动到与过滤器相同的文件中,那么它的工作原理.实际上,如果您将CardType枚举从Card中分离出来,只需将CardType移动到带有过滤器的文件中即可.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...