在获得有关 a question yesterday 的帮助后我仍然无法完全理解这一点,或者为什么允许以下内容:
let string = NSString.hasPrefix("aString")
对我来说,这看起来就像我只是直接从一个类中调用一个实例方法。在上面的示例中,它并没有特别的意义,但显然是允许的,因为它既可以在没有警告的情况下编译,也可以在没有任何错误的情况下运行。
如果能帮助我消除我对 Swift 的(大量)无知的这一特定部分,我们将不胜感激。
编辑:这可能是因为在 Swift 中没有将类和实例方法分开,并且它是处理 Objective-C 和 Swift 之间这种差异的一种方式?
最佳答案
对我来说,看起来实例方法基本上是 curried将实例作为第一个参数的类方法:
import Foundation
let string = NSString(string:"foobar")
string.hasPrefix("foo") // => true
NSString.hasPrefix(string)("foo") // => true
所以基本上,写cls.method(instance)
似乎和写instance.method
一样(注意方法是闭包,你可以将它们赋值给变量稍后调用它们):
let f1 = string.hasPrefix
let f2 = NSString.hasPrefix(string)
f1("f") // => true
f1("foob") // => true
f1("nope") // => false
f2("f") // => true
f2("foob") // => true
f2("nope") // => false
注意:这是它的行为方式,也是我认为合乎逻辑的方式(例如,Python 的工作方式类似)。我不知道这是不是真的。
关于swift - 为什么允许我调用类的实例方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24106275/