【问题标题】:Swift closure: Cannot convert value of type '(_) -> Bool' to expected argument typeSwift 闭包:无法将 '(_) -> Bool' 类型的值转换为预期的参数类型
【发布时间】:2016-10-12 23:46:40
【问题描述】:

我正在使用 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)

【问题讨论】:

  • 尝试给卡片一个明确的类型:return hand.filter({ (card: Card) -> Bool in return card.type == .Red })
  • 您的代码对我来说编译得很好...也许尝试清理您的构建文件夹?
  • 您没有在同一范围内的其他地方定义cardCard 吗?代码对我来说也编译得很好。
  • 您能否在已编译的项目(而不是 Playground)中重现该问题?
  • 嗯,这很奇怪...如果您将Card 声明与Player 声明放在同一个文件中,它将正常工作。一定要提交一份关于那个的错误报告。

标签: xcode swift


【解决方案1】:

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 })

在 cmets 中提到,如果您将 Card 的定义移动到与过滤器相同的文件中,它就会起作用。事实上,如果你将 CardType 枚举的定义从 Card 中分离出来,然后将 CardType 移动到带有过滤器的文件中,它就可以工作。

【讨论】:

  • 做到了,谢谢 - 将关注这个问题。 return 也不是必需的,如果单个语句的返回值与闭包的预期返回类型匹配,则可以推断:return hand.filter({ (card: Card) in card.type == .Red })
  • @CraigOtis 它与编译顺序有关。如果 Card 在与 Player 相同的文件中声明,则它可以工作。
  • 完全指定枚举类型也可以! return hand.filter({ $0.type == Card.CardType.Red })
猜你喜欢
  • 1970-01-01
  • 2020-06-21
  • 2020-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-26
  • 2017-02-07
  • 1970-01-01
相关资源
最近更新 更多