Метод load() определяет метод класса Objective-C "load", который не разрешен Swift 1.2
Я использую Parse, и я создаю подкласс PFObject, соответствующий протоколу PFSubclassing!
Он работал отлично, но теперь я использую Swift 1.2, и это дает мне эту ошибку:
1. override class func load() {
2. self.registerSubclass()
3. }
В строке 1: Метод 'load()' определяет Objective-C метод класса load, который не разрешен Swift 1.2
У кого-нибудь есть эта проблема? Как я могу исправить?
Ответы
Ответ 1
Существует статья NSHispster о методе swizzling, которая затрагивает это в другом контексте:
К сожалению, метод класса нагрузки, реализованный в Swift, никогда не вызванный временем выполнения, что делает эту рекомендацию невозможной. Вместо этого нам остается выбирать варианты второго выбора:
-
Использовать метод swizzling при инициализации. Это можно сделать безопасно, если вы проверяете тип во время выполнения и завершаете swizzling в dispatch_once (который вы все равно должны делать).
-
Внедрить метод swizzling в делетете приложения. Вместо добавления метода swizzling через расширение класса просто добавьте метод в приложение делегат должен быть выполнен, когда вызывается приложение (_: didFinishLaunchingWithOptions:). В зависимости от классы, которые вы изменяете, этого может быть достаточно, и гарантируйте, что ваш код будет выполняться каждый раз.
Ссылка: http://nshipster.com/swift-objc-runtime/
-
Дополнительная информация по форуму dev:
Swift 1.1 позволил вам определить методы "+ load" с помощью "class func load()", но они не были запущены во время запуска вашего приложения например, методы Objective-C + load. Swift 1.2 запрещает их избегать что это может сработать.
Ссылка: https://devforums.apple.com/message/1102025#1102025
-
tl; dr initialize()
и didFinishLaunchingWithOptions
кажутся приличными местами для таких вещей в Swift.
Ответ 2
Я вызываю метод registerSubclass()
в AppDelegate до Parse.setApplicationId
для каждого подкласса PFObject
, и он работает.
Ответ 3
Попробуйте следующее:
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
Ответ 4
Я заработал, заменив его:
override class func initialize() {
}
Ответ 5
Переопределение load()
никогда не работало с Swift. Раньше его просто не называли. Затем я подал ошибку Apple (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");
}
}
Так что.... не надо. Даже если в документации указано иное.