web-dev-qa-db-ja.com

メソッド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では許可されていません

誰かがまだこの問題を抱えていますか?どうすれば修正できますか?

26
txaidw

さまざまなコンテキストでこれに触れるメソッドスウィズリングに関するNSHispsterの記事があります。

残念ながら、Swiftで実装されたロードクラスメソッドはランタイムによって呼び出されることはなく、その推奨は不可能になります。代わりに、2番目の選択肢の中から選択する必要があります。

  • 初期化でメソッドスウィズリングを実装します。実行時にタイプをチェックし、スウィズリングをdispatch_onceでラップする限り(これは安全に実行できます)。とにかくやっている)。

  • アプリデリゲートにメソッドスウィズリングを実装します。クラス拡張を介してメソッドスウィズリングを追加する代わりに、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

-

tl; dr initialize()didFinishLaunchingWithOptionsは、Swiftではそのようなものに適した場所のようです。

17

PFObjectのすべてのサブクラスに対して_Parse.setApplicationId_の前にAppDelegateのregisterSubclass()メソッドを呼び出しています。これは機能します。

7
egor.zhdan

これを試して :

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

解析ドキュメントが更新されました: https://www.parse.com/docs/ios/guide#objects-subclassing-pfobject

7

私はそれを次のものに置き換えることによってそれを機能させました:

override class func initialize() {
}
5
ashokgelal

オーバーライドload()never 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");
    }
}

だから....しないでください。ドキュメントに別段の記載がある場合でも。

5
Marcin