【问题标题】:Why am I allowed to call instance methods on a class?为什么允许我在类上调用实例方法?
【发布时间】:2014-06-08 12:43:11
【问题描述】:

在收到a question yesterday 的帮助后,我仍然无法完全理解这一点,或者为什么允许以下操作:

let string = NSString.hasPrefix("aString")

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

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


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

【问题讨论】:

    标签: swift instance-methods


    【解决方案1】:

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

    【讨论】:

    • 是的,这似乎是它的工作方式,谢谢。所以本质上,let string = NSString.hasPrefix("aString") 是一个字符串实例上的 函数 hasPrefix,其值为“aString”,对吧?
    • 一定是这样,因为我实际上可以通过调用 string("a") 来获取 Bool 值,方法是让 trueOrFalse = string("a") 返回 true。我需要一些时间来解决这个问题。看起来很酷,但我还没有真正看到这种模式的实用价值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2022-06-26
    相关资源
    最近更新 更多