无法使用Swift数组';s first()方法
所以,我有一个简单的代码无法使用Swift数组';s first()方法,swift,swift3,Swift,Swift3,所以,我有一个简单的代码 let arr = [8, 0, 2, 4] let result = arr.first(where: { $0 == someparam }) print(result) 而且,我得到了错误 无法调用非函数类型“Int”的值 这是因为数组类有一个实例属性first 我在swift文档网站上搜索了很多,但没有找到任何说明如何正确调用此方法的内容 更糟糕的是,我无法理解Array类如何拥有同名的属性和方法实例 考虑到someparam的类型是Int: let arr
let arr = [8, 0, 2, 4]
let result = arr.first(where: { $0 == someparam })
print(result)
而且,我得到了错误
无法调用非函数类型“Int”的值
这是因为数组类有一个实例属性first
我在swift文档网站上搜索了很多,但没有找到任何说明如何正确调用此方法的内容
更糟糕的是,我无法理解Array类如何拥有同名的属性和方法实例
考虑到
someparam
的类型是Int
:
let arr = [8, 0, 2, 4]
let someparam = 2
let result = arr.first(where: { $0 == someparam })
print(result!)
Out:
二,
这是正确的
针对您的问题:为什么可能有一个方法和一个实例变量具有相同的名称?嗯,first(谓词:)
是一个获取参数的实例方法,而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)")
}
}
正如您所看到的,不同之处在于,这次方法有一个参数。考虑到
someparam
的类型是Int
:
let arr = [8, 0, 2, 4]
let someparam = 2
let result = arr.first(where: { $0 == someparam })
print(result!)
Out:
二,
这是正确的
针对您的问题:为什么可能有一个方法和一个实例变量具有相同的名称?嗯,first(谓词:)
是一个获取参数的实例方法,而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)")
}
}
正如您所看到的,不同之处在于,这次该方法有一个参数。还请注意,如果在where闭包中有语法错误,则会得到同样的无用错误: 无法调用非函数类型“Int”的值 原始海报的代码由答案的someparam声明确定:
let someparam = 2
我猜闭包中的语法错误会让斯威夫特认为您使用的是错误的属性,而不是错误的函数。还要注意,如果您的where闭包中有语法错误,您会得到同样的无益错误: 无法调用非函数类型“Int”的值 原始海报的代码由答案的someparam声明确定:
let someparam = 2
我猜闭包中的语法错误会导致swift认为您使用的属性不正确,而不是函数不正确。什么是
someparam
?使用类型为Int
的someparam
编译对我来说很好。带括号的first()是一个方法。第一个不带括号的是一个属性。首先,苹果公司将其参数作为区分因素,使其超载。first()方法查找与谓词匹配的元素的第一个匹配项,而first属性将返回数组的第一个元素。错误消息具有误导性。我在lambda(闭包)里出了点问题。我重写了闭包,现在它可以工作了。在我的例子中,我将“=”而不是“=”放在where比较中。只需忽略误导性错误消息,并仔细检查闭包是否存在语法错误。希望这有帮助。什么是someparam
?使用类型为Int
的someparam
编译对我来说很好。带括号的first()是一个方法。第一个不带括号的是一个属性。首先,苹果公司将其参数作为区分因素,使其超载。first()方法查找与谓词匹配的元素的第一个匹配项,而first属性将返回数组的第一个元素。错误消息具有误导性。我在lambda(闭包)里出了点问题。我重写了闭包,现在它可以工作了。在我的例子中,我将“=”而不是“=”放在where比较中。只需忽略误导性错误消息,并仔细检查闭包是否存在语法错误。希望这有帮助。