【问题标题】:Method load() defines Objective-C class method 'load', which is not permitted by Swift 1.2方法 load() 定义了 Swift 1.2 不允许的 Objective-C 类方法 'load'
【发布时间】:2015-02-10 01:14:09
【问题描述】:

我正在使用 Parse,我正在创建一个符合 PFSubclassing 协议的 PFObject 子类! 一切正常,但现在我使用的是 Swift 1.2,它给了我这个错误:

1. override class func load() {
2.      self.registerSubclass()
3. }

第 1 行:方法 'load()' 定义了 Objective-C 类方法 'load',Swift 1.2 不允许这样做

有人有这个问题吗?我该如何解决?

【问题讨论】:

  • 你真的是在说function 而不是func?这是某种 Parse 的东西吗?

标签: ios objective-c swift parse-platform


【解决方案1】:

有一篇关于方法调配的 NSHispster 文章在不同的上下文中涉及到这一点:

不幸的是,在 Swift 中实现的加载类方法永远不会 由运行时调用,使该建议成为不可能的。 相反,我们只能在第二选择中进行选择:

  • 在 initialize 中实现方法 swizzling。 这可以安全地完成,只要您在执行时检查类型并将 swizzling 包装进去 dispatch_once(无论如何你都应该这样做)。

  • 在应用程序委托中实现方法调配。 无需通过类扩展添加方法调配,只需向应用添加一个方法 代表何时执行 application(_:didFinishLaunchingWithOptions:) 被调用。根据 您正在修改的类,这可能就足够了,应该 保证您的代码每次都执行。

链接:http://nshipster.com/swift-objc-runtime/

-

更多信息来自开发者论坛:

Swift 1.1 允许你用“class func”定义“+load”方法 load()”,但它们实际上并未在您的应用程序启动时运行 就像 Objective-C +load 方法一样。 Swift 1.2 禁止他们避免 感觉这可能会奏效。

链接:https://devforums.apple.com/message/1102025#1102025

-

tl;dr initialize()didFinishLaunchingWithOptions 在 Swift 中似乎是这样的好地方。

【讨论】:

  • 最完整的答案,所以我标记为官方答案!谢谢大佬!
【解决方案2】:

试试这个:

override class func initialize() {
   var onceToken : dispatch_once_t = 0;
   dispatch_once(&onceToken) {
      self.registerSubclass()
   }
}

Parse 文档已更新:https://www.parse.com/docs/ios/guide#objects-subclassing-pfobject

【讨论】:

    【解决方案3】:

    我在 Parse.setApplicationId 之前为 PFObject 的每个子类调用 AppDelegate 中的 registerSubclass() 方法,它可以工作。

    【讨论】:

      【解决方案4】:

      覆盖load() 从不与 Swift 一起使用。早期它根本没有被调用。我当时为 Apple 提交了一个错误(错误 ID 18423731),最近我得到了一个回复,该问题已通过明确通知开发人员在 Swift 中不允许这样做来解决。

      extension UIButton {
          // !! never called
          override public class func load() { // Method 'load()' defines Objective-C class method 'load', which is not permitted by Swift 1.2
              super.load()
              println("not called earlier anyway");
          }
      }
      

      所以....不要。即使文档另有说明。

      【讨论】:

        【解决方案5】:

        我把它替换为:

        override class func initialize() {
        }
        

        【讨论】:

        • 请注意+load+initialize 是不同的。 +load 在加载二进制文件时运行,无论是否使用类;并且您可以拥有多个+load 方法——除了主要的方法之外,每个类别中都有一个——所有这些都不会相互干扰(通常类别方法会替换现有的同名方法)。另一方面,+initialize 在第一次收到消息时会懒惰地运行。
        • @newacct 你知道 Swift 中 load() 的等价物吗?现在我将上面的评论作为答案,因为它现在解决了我的问题
        猜你喜欢
        • 2019-08-21
        • 2019-11-07
        • 1970-01-01
        • 2015-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多