2016-05-23 8 views
6

次のメソッドをオーバーライドできないようで、数時間前から私を悩ませていたスタンドアロンのサンプルを作成しました。SwiftのObj-CクラスメソッドをオーバーライドしてNSArrayを返す

これはほぼ間違いですが、基底クラスがObjective Cで、具体的には戻り値の型がNSArray*のスワイプクラスのクラスメソッドをオーバーライドできないようです。戻り値の型が*

NSStringのような単純なものに変更された場合

Error shown, with definition of class and superclass

しかし、それは正常に動作します:

私はエラーを取得し、「Method does not override any method from its superclass

だから私の失敗は以下の通りです

Working example with NSString

今私はArray<AnyObject>とpを試してみました他のいくつかと一緒に横たわっていましたが、私はまだSwiftのシンタックスで少し新鮮です。

+0

@Kexどのように問題を解決するを書くことができます宣言しますか?ユーザーがクラスメソッドを実装しようとしています。 – JAL

答えて

5

NSArray *[AnyObject]!(暗黙的にアンラップされたのAnyObjectのインスタンス)に橋渡しされています。 [ExampleBase exampleMethod]のために生成されたスウィフトのインターフェースを見てください:

ExampleBase

[AnyObject]!にあなたの方法の戻り値の型を変更し

override class func exampleMethod() -> [AnyObject]?

+ (NSArray *)exampleMethod;+ (NSArray * _Null_unspecified)exampleMethod;override class func exampleMethod() -> [AnyObject]

+ (NSArray * _Nullable)exampleMethod;ブリッジに

+ (NSArray * _Nonnull)exampleMethod;ブリッジ:

override class func exampleMethod() -> [AnyObject]! { 
    return [] 
} 

は、Objective-CのNULL可能指定子を使用して、あなたのスウィフトサブクラスでオプションや具体的な値を指定するには暗黙的にアンラップされたオプションと同じ振る舞いを持ちます。

+0

答えのThx、私はそれを試みたと思った!しかし、私は逃した!最後に。定義を確認するための良いヒント、なぜ私はそれを試していないアイデア。 –

3

解決策は、型に関する詳細情報をコンパイラに与えることです。 ObjCで

は方法

+ (NSArray<NSString *>*)exampleMethod; 

はその後、スウィフトにあなたが

override class func exampleMethod() -> [String] 
関連する問題