不能使用Swift数组的first()方法

时间:2016-12-27 22:25:57

标签: swift swift3

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

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

2 个答案:

答案 0 :(得分:3)

考虑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)")
    }
}

正如您所看到的,不同之处在于此次方法具有参数。

答案 1 :(得分:2)

另请注意,如果 where 关闭时出现语法错误,则会收到相同的无用错误:

  

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

的值

原始海报的代码由答案的someparam声明修正:

let someparam = 2

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