我正在使用Parse,并且我正在创建符合协议PFSubclassing的PFObject子类! 它工作得很好,但现在我使用Swift 1.2并且它给了我这个错误:
1. override class func load() {
2. self.registerSubclass()
3. }
第1行:方法' load()'定义了Objective-C类方法' load',这是Swift 1.2不允许的
有人有这个问题吗?我该如何解决?
答案 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");
}
}
所以....不要。即使文档说不是这样。