【问题标题】:Swift: Cannot call value of non function type - trailing closureSwift:无法调用非函数类型的值 - 尾随闭包
【发布时间】:2017-03-22 22:51:39
【问题描述】:

我有下面这行代码

if let a = assetConfigs.first { $0.code == cells[2] }
{...}

assetConfigsAssetConfig 类型的对象数组,它有一个名为 code 的属性

我得到了错误

Cannot call value of non-function type AssetConfig?

我只想要第一个资产配置,它与单元格[2] 中包含的值具有相同的代码。 Swift 下的数组有一个叫做first 的函数,它返回第一个满足特定条件的对象。 (https://developer.apple.com/reference/swift/array/1848165-first)

我做错了什么?

【问题讨论】:

  • 如果你消除花括号if let a = assetConfigs.first(where: { $0.code == cells[2] })的歧义,你会遇到同样的问题吗?
  • 您需要使用括号来消除尾随闭包的歧义,例如stackoverflow.com/q/34930596/2976878
  • 好的,我明白了——因为编译器无法判断我是先调用属性'first'然后开始我的 if 语句块还是调用带有尾随闭包的函数'first'。我得到它。谢谢!
  • 我遇到了同样的问题,但消除歧义似乎并不能解决它。如果你有这个编译和工作,请在问题的答案中提供一个例子

标签: arrays swift


【解决方案1】:

这里有一个微妙的陷阱可以隐藏底层的语法错误。即使有一个消除歧义的调用,如果闭包的主体中有错误,编译器也会报告它不能调用非函数类型的值。通过修复闭包中的错误,它将编译:

不能调用非函数类型的值

let a = assetConfigs.first(where: { $0.code == "TEST" /* incompatible types */ }) {
  ...
}

编译:

let a = assetConfigs.first(where: { $0.code == cells[2] }) {
  ...
}

我似乎这是由于 Array 成员函数 first 有两个定义,并且编译器正在选择它识别的 第一个 问题 - 返回可选的成员函数 first数组元素不是函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多