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

问题描述:

我正在使用Swift中的filter()方法,但遇到了我在操场中似乎无法重现的问题。Swift结束:无法将类型'(_) - > Bool'的值转换为预期的参数类型

编辑:上传实例项目位置: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的自动完成关闭签名/身,想着我有一个语法错误,但它一直重新创建相同的(正确吗?)的方式:

enter image description here

我也试着编辑Xcode中什么自动生成并提供了一个简单的版本,但没有成功:

enter image description here

同理:

enter image description here

正如我所提到的,我无法在一个简单的操场示例中重现此操作,但我无法缩小在我的主项目中导致问题的实际

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

这个错误是其他一些实际问题的常见红鲱鱼吗?

注:使用的Xcode 7.3.1(7D1014)

+0

尝试给卡显式类型:'return hand.filter({(card:Card) - > Bool in return card.type == .Red })' – vacawama

+2

你的代码对我来说编译得很好......也许尝试清理你的生成文件夹? – Hamish

+1

难道你没有在同一范围内的其他地方定义'card'或'Card'吗?代码也适合我编译。 – Sulthan

的薄片状的东西与斯威夫特的类型推断happing。给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移动到带有过滤器的文件中,它就会起作用。

+0

这样做,谢谢 - 将会解决这个问题。 'return'也是没有必要的,如果单个语句的返回值与闭包的期望返回类型相匹配,则推断它为''card.type == .Red}中的return hand.filter({(card:Card) )' –

+0

@CraigOtis它与编译的顺序有关。如果'Card'在与'Player'相同的文件中声明,它就可以工作。 – Sulthan

+0

完全指定枚举类型也适用! 'return hand.filter({$ 0.type == Card.CardType.Red})' – vacawama