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

txa*_*idw 25 objective-c ios parse-platform swift

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

1. override class func load() {
2.      self.registerSubclass()
3. }
Run Code Online (Sandbox Code Playgroud)

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

有人有这个问题吗?我该怎么办?

Nik*_*kin 17

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

不幸的是,Swift中实现的加载类方法永远不会被运行时调用,因此该建议是不可能的.相反,我们只能选择第二选择:

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

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

链接: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;博士initialize(),didFinishLaunchingWithOptions似乎是斯威夫特这类事情的好地方.


ego*_*dan 7

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


小智 6

试试这个 :

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

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


ash*_*lal 5

我把它替换为:

override class func initialize() {
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`+ load`和`+ initialize`是不同的.无论是否使用该类,加载二进制文件时都会运行`+ load`; 并且你可以有多个`+ load`方法 - 除了主要方法之外每个类别一个 - 所有方法都没有相互干扰(通常类别方法用相同的名称替换现有的方法).另一方面,`+ initialize`在第一次收到类消息时懒惰地运行. (4认同)

Mar*_*cin 5

覆盖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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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