Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用Swift数组';s first()方法_Swift_Swift3 - Fatal编程技术网

无法使用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比较中。只需忽略误导性错误消息,并仔细检查闭包是否存在语法错误。希望这有帮助。