如何调用具有类级别指定功能的字段? 这是我正在使用的代码片段:
class Foo {
let alias = whatever
func whatever() -> Int {
return 3
}
}
print(Foo().alias) // print out this is a function
print(Foo().alias()) // compilation error about missing argument
首先,我知道我可以使用Foo.whatever()代替。
但让我解释一下为什么我会问这个问题。
通常情况下,如果我正在使用游乐场,它正如我所期望的那样,如果我有一个函数,然后我将它分配给一个变量。它具有完全相同的代码,但它只是在课堂范围之外。
let alias = whatever
func whatever() -> Int {
return 3
}
print(alias) // print out function
print(alias()) // print 3 so it is working as expected
不知道为什么我无法在类级别调用它,如果无法调用它,为什么swift没有关于类级let alias = whatever
的编译错误
答案 0 :(得分:1)
你无法在类级别调用它,因为 alias
不是实例方法,而是返回另一个函数的函数({{1} } 在这种情况下)。并且Swift编译器确实提供了whatever
编译错误,正如您在第一个代码块中提到的那样:
Missing argument for parameter #1 in call
您可以通过以下别名调用print(Foo().alias()) // compilation error about missing argument
函数:
whatever
这意味着let instance = Foo()
instance.alias(instance)()
函数只有一个参数,一个alias
实例,并返回另一个函数。后一个函数什么都不带,返回Foo
,Int
的类型是:
alias
基本上,Swift中的实例方法只是一个类型方法,它将实例作为参数并返回一个函数,然后将该函数应用于实例:
(Foo) -> () -> Int
使用以下代码检查实际的Foo.whatever(instance)()
类型:
alias
答案 1 :(得分:0)
要做到这一点,你需要一个计算属性,这将起作用:
\b