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

时间:2015-02-10 01:14:09

标签: ios objective-c swift parse-platform

我正在使用Parse,并且我正在创建符合协议PFSubclassing的PFObject子类! 它工作得很好,但现在我使用Swift 1.2并且它给了我这个错误:

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

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

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

5 个答案:

答案 0 :(得分:17)

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

  

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

     
      
  • 在初始化时实现方法调整。这可以安全地完成,只要你在执行时检查类型并包裹调整   dispatch_once(无论如何你都应该这样做。)

  •   
  • 在应用委托中实施方法调整。只需向应用添加方法,而不是通过类扩展添加方法。   委托时执行   调用application(_:didFinishLaunchingWithOptions :)。取决于   你正在修改的类,这可能就足够了   保证每次都执行代码。

  •   

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

-

更多信息表单dev论坛:

  

Swift 1.1允许您使用“class func”定义“+ load”方法   load()“,但它们实际上并不是在应用启动时运行的   像Objective-C +加载方法一样。 Swift 1.2禁止它们以避免   这可能会起作用。

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

-

tl; dr initialize()didFinishLaunchingWithOptions似乎是斯威夫特这类事情的好地方。

答案 1 :(得分:7)

我在registerSubclass()之前为Parse.setApplicationId调用PFObject方法,{{1}}的每个子类都有效。

答案 2 :(得分:6)

试试这个:

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 :(得分:5)

我通过将其替换为:

来实现它
override class func initialize() {
}

答案 4 :(得分: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");
    }
}

所以....不要。即使文档说不是这样。