4

在昨天收到一个问题的帮助后,我仍然无法完全理解这个问题,或者为什么允许以下内容:

let string = NSString.hasPrefix("aString")

对我来说,这看起来就像我只是直接从一个类中调用一个实例方法。在上面的示例中,它并不是特别有意义,但它显然是允许的,因为它既可以在没有警告的情况下编译,也可以在没有任何错误的情况下运行。

任何有助于消除我对 Swift 的(巨大)无知的这一特定部分的帮助将不胜感激。


编辑:这可能是因为 Swift 中没有分离类和实例方法以及它是处理 Objective-C 和 Swift 之间这种差异的一种方法吗?

4

1 回答 1

3

在我看来,实例方​​法基本上是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 的工作方式类似)。我不知道这是不是真的。

于 2014-06-08T13:21:25.303 回答