【问题标题】:Swift : Why is the class method struck outSwift:为什么类方法被删除
【发布时间】:2014-06-05 11:52:10
【问题描述】:

只要 Swift 类从 NSObject 扩展而来,我们就可以将它传递给 Objective-C 运行时并要求它为我们自省。

我们有三个选择:

  • classForCoder
  • classForKeyedArchiver

。 .但是类被删除了。 (见图)。为什么是这样?

【问题讨论】:

    标签: swift objective-c-runtime


    【解决方案1】:

    那是因为class 是 Swift 中的关键字,因此任何有效的方法都不能命名为class。同理,您不能创建名为forwhile 或其他关键字的方法。

    我无法用我的方法重现删除,但是,在 obj-c 中命名方法 var(或其他关键字)使得无法从 Swift 调用。

    编辑

    我错了。仍然可以使用 Swift 调用 class

    var clazz: AnyClass? = self.`class`()
    

    但是,编译器会说:

    “类”不可用:改用“动态类型”

    所以 Edwin Vermeers 的答案是正确的。

    【讨论】:

    • 了解有用,但并不能真正解释为什么 'class()' 会出现在代码完成下拉菜单中,更不用说突出显示了。
    • 是的,您可以通过在声明中使用反引号来创建名为 classforwhile 或其他关键字的方法:func `func`() -> Void { ... }
    【解决方案2】:

    正如您在文档中看到的,它仅在 Objective C 中可用,而在 swift 中不可用。 见:https://developer.apple.com/documentation/objectivec/nsobject/1571950-class

    我认为这是因为 AnyObject 为您提供了足够的信息(比 NSObject 更多) 例如,您可以在 swift 中执行 NSStringFromClass(BaseObject) 而不是在 Objective C 中执行的 NSStringFromClass([BaseObject class])

    【讨论】:

    • 是的,注意到类本身是一个 AnyClass 类型。有趣的是,Birdy.classForCoder 和 Birdy.classForKeyedArchiver 可以传递给运行时,但不能传递给 Birdy 本身。 (下一个问题)
    • 你是对的。我设法找到了一个证明你的答案是正确的。
    猜你喜欢
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 2018-02-14
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多