我正在使用Parse并创建一个符合PFSubclassing协议的PFObject子类!之前一切都正常,但现在我正在使用Swift 1.2,它给了我这个错误:
1. override class func load() {
2. self.registerSubclass()
3. }
第1行: 方法 'load()' 定义了 Objective-C 类方法 'load', 这在 Swift 1.2 中是不允许的。
有人遇到过这个问题吗?我该怎么解决?
我正在使用Parse并创建一个符合PFSubclassing协议的PFObject子类!之前一切都正常,但现在我正在使用Swift 1.2,它给了我这个错误:
1. override class func load() {
2. self.registerSubclass()
3. }
第1行: 方法 'load()' 定义了 Objective-C 类方法 'load', 这在 Swift 1.2 中是不允许的。
有人遇到过这个问题吗?我该怎么解决?
有一篇 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 中似乎是不错的实现方法。
试试看:
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
。在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");
}
}
在AppDelegate中,我为每个PFObject
的子类调用了registerSubclass()
方法,并在Parse.setApplicationId
之前执行,这样可以使其正常工作。
我通过替换它来使其正常工作:
override class func initialize() {
}
+load
和 +initialize
是不同的。+load
在二进制文件加载时运行,无论类是否被使用;而且你可以有多个 +load
方法--一个在主要方法之外的每个分类中--所有这些方法都不会互相干扰(通常分类方法会用同名方法替换现有方法)。另一方面,+initialize
在第一次向类发送消息时懒惰地运行。 - newacct