Подтвердить что ты не робот

Метод 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

У кого-нибудь есть эта проблема? Как я могу исправить?

4b9b3361

Ответ 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, и он работает.

Ответ 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");
    }
}

Так что.... не надо. Даже если в документации указано иное.