方法load()定义了Objective-C类方法'load',这在Swift 1.2中是不允许的。

28

我正在使用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”吗?这是一些解析相关的事情吗? - matt
5个回答

20

有一篇 NSHipster 文章介绍了方法交换,它在不同的上下文中探讨了这个话题:

不幸的是,用 Swift 实现的 load class 方法从未被运行时调用过,这使得推荐使用此方法成为不可能。相反,我们必须在以下的次选方案之间选择:

  • 在 initialize 中实现方法交换。 只要你在执行时检查类型并将交换包装在 dispatch_once 中(这是你本来就应该做的),就可以安全地完成这个操作。

  • 在 app delegate 中实现方法交换。 不要通过类扩展添加方法交换,而是在应用程序的 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

-

总结一下:initialize()didFinishLaunchingWithOptions 在 Swift 中似乎是不错的实现方法。


最完整的答案,所以我标记为官方答案!谢谢朋友! - txaidw

9

7

在Swift中,覆盖load()从来没有起作用。早期它根本没有被调用。我当时为苹果提出了一个错误报告(Bug 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");
    }
}

所以……不要这样做。即使文档上说可以。

7

在AppDelegate中,我为每个PFObject的子类调用了registerSubclass()方法,并在Parse.setApplicationId之前执行,这样可以使其正常工作。


5

我通过替换它来使其正常工作:

override class func initialize() {
}

4
请注意,+load+initialize 是不同的。+load 在二进制文件加载时运行,无论类是否被使用;而且你可以有多个 +load 方法--一个在主要方法之外的每个分类中--所有这些方法都不会互相干扰(通常分类方法会用同名方法替换现有方法)。另一方面,+initialize 在第一次向类发送消息时懒惰地运行。 - newacct
@newacct 你知道Swift中load()的等效方法吗?目前我将上面的评论留作答案,因为它暂时解决了我的问题。 - txaidw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接