私はParseを使用しており、プロトコルPFSubclassingに準拠したPFObjectサブクラスを作成しています。それはすべて正常に機能していましたが、現在Swift 1.2を使用しており、次のエラーが発生します。
1. override class func load() {
2. self.registerSubclass()
3. }
1行目:メソッド 'load()'はObjective-Cクラスのメソッド 'load'を定義していますが、これはSwift 1.2では許可されていません
誰かがまだこの問題を抱えていますか?どうすれば修正できますか?
さまざまなコンテキストでこれに触れるメソッドスウィズリングに関する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ではそのようなものに適した場所のようです。
PFObject
のすべてのサブクラスに対して_Parse.setApplicationId
_の前にAppDelegateのregisterSubclass()
メソッドを呼び出しています。これは機能します。
これを試して :
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
私はそれを次のものに置き換えることによってそれを機能させました:
override class func initialize() {
}
オーバーライド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");
}
}
だから....しないでください。ドキュメントに別段の記載がある場合でも。