所以,我有这个简单的代码
let arr = [8, 0, 2, 4]
let result = arr.first(where: { $0 == someparam })
print(result)
并且,我收到了错误
无法调用非功能类型的值' Int?'
这是因为Array类有一个实例属性 first
我在swift文档网站上搜索了很多,但我找不到任何说明我应该如何正确调用此方法的内容。
更重要的是,我无法理解Array类如何具有属性和具有相同名称的方法实例
答案 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认为你错误地使用了属性,而不是错误地使用了函数。