swift - 为什么允许我调用类的实例方法?

标签 swift instance-methods

在获得有关 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/

相关文章:

iOS:初始化对象的正确方法?

ruby-on-rails - 我知道如何设置类方法,但如何动态设置实例方法?

java - 如何从代码中删除静态方法(以及如何替换它们)

java - 在同一个类的实例方法中使用静态方法

ios - 在 Swift 中使用 commitEditingStyle 动态删除 UITable 部分

ios - 在登录成功时执行 segue

ios - "Downcasting"Swift 中的 C 结构

java - 为什么从内部类调用特定于对象的方法/字段时没有抛出错误?

ios - 通过 swift 将您设计的 IOS 应用程序连接到您的 Dynamics 365 CRM 解决方案?

ios - 如何在 Swift 中以编程方式更改自定义 UITableViewCell 中按钮的背景颜色?