【问题标题】:Cannot use Swift array's first() method不能使用 Swift 数组的 first() 方法
【发布时间】:2017-06-06 00:00:05
【问题描述】:

所以,我有这个简单的代码

let arr = [8, 0, 2, 4]
let result = arr.first(where: { $0 == someparam })
print(result)

而且,我得到了错误

不能调用非函数类型'Int?'的值

这是因为 Array 类有一个实例属性first

我在 swift 文档网站上进行了很多搜索,但找不到任何说明我应该如何正确调用此方法的内容。

更看不懂Array类怎么会有同名的属性和方法实例

Swift's official api on the 'first()' method

Swift's official api on the 'first' property

【问题讨论】:

  • someparam 是什么?使用 Int 类型的 someparam 编译对我来说很好。
  • first() 带括号是一种方法。首先不带括号的是属性。 first 以其参数作为 Apple 的差异化因素而重载。 first() 方法查找与谓词匹配的元素的第一次出现,而第一个属性将返回数组的第一个元素。
  • 我遇到了同样的问题。错误信息具有误导性。我在 lambda(闭包)中有问题。我重写了闭包,它现在可以工作了。
  • 在我的情况下,我在 where 比较中放置了“=”而不是“==”。只需忽略误导性错误消息并仔细检查您的闭包是否存在任何语法错误。希望这会有所帮助。

标签: swift swift3


【解决方案1】:

考虑someparam的类型是Int

let arr = [8, 0, 2, 4]
let someparam = 2
let result = arr.first(where: { $0 == someparam })
print(result!)

出局: 2

这可以正常工作。

针对您的问题,为什么可以拥有同名的方法和实例变量?嗯,first(predicate:) 是一个带参数的实例方法,而first 是一个实例属性。

我认为您的困惑是因为执行以下操作无效:

struct MyStruct {
    var myProperty: Int? {
        return 2
    }

    func myProperty() {
        print("Hello")
    }
}

我认为在这种情况下,编译器很难确定哪个是哪个。但是,以下内容是有效的:

struct MyStruct {
    var myProperty: Int? {
        return 2
    }

    func myProperty(number: Int) {
        print("Hello \(number)")
    }
}

如你所见,不同的是这次方法有一个参数。

【讨论】:

    【解决方案2】:

    另请注意,如果您的 where 闭包中有语法错误,您会得到同样无用的错误:

    不能调用非函数类型'Int?'的值

    原始发帖人的代码已通过 someparam 的答案声明修复:

    let someparam = 2
    

    我猜测闭包中的语法错误会导致 swift 认为您错误地使用了属性,而不是错误地使用了函数。

    【讨论】:

      猜你喜欢
      • 2020-02-07
      • 1970-01-01
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      • 1970-01-01
      相关资源
      最近更新 更多