2016-12-12 4 views
1

を動作しません。(いくつかのLIB)スウィフトでのファクトリメソッドとサブクラスObjective-Cのクラス、ジェネリック医薬品は、私はObjective-Cで書かれたファクトリメソッドで基本クラスを持っている

@interface Base : NSObject 
@property(nonatomic, strong) NSString *content; 
+ (instancetype)baseWithContent:(NSString *)content; 
@end 
//================== 
@implementation Base 
+ (instancetype)baseWithContent:(NSString *)content { 
    Base* base = [[Base alloc]init]; 
    base.content = content; 
    return base; 
} 
@end 

その後、私はそれをサブクラス化迅速かつANYOBJECTにそれをキャスト。(ブリッジング・ヘッダ部分を無視する)

class Child: Base {} 
var c = Child(content: "Child") 
print("before casting", type(of:c)) 
print("after casting", type(of:c as AnyObject)) 

で、それは鋳造後のベースとなっというこの奇妙な結果を取得します。私はObjective-Cのから生成され、利便性のイニシャライザをオーバーライドするために指定イニシャライザを使用する場合

before casting Optional<Child> 
after casting Base 

は実は、私は正しい結果を得ることができます。

class Child: Base { 
    init?(content:String) { 
     super.init() 
     self.content = content 
    } 
} 

before casting Optional<Child> 
after casting Child 

私は間違いをしますか?回答ありがとうございます。 私はXcodeバージョン8.1(8B62)とSwift 3.0.1を使用しています

答えて

1

Obj-Cのファクトリメソッドの実装が間違っています。常にBaseのインスタンスを作成します。それを修正するには:

+ (instancetype)baseWithContent:(NSString *)content { 
    Base *base = [[self alloc] init]; //self instead of Base 
    base.content = content; 
    return base; 
} 

を基本的には、あなたのファクトリメソッドの実装は、その戻り値の型と一致していませんスウィフトは、型宣言を信頼するため、結果はスウィフトタイプの問題です。

+0

ありがとうございます!そうですか。 "迅速な型宣言" ...どのようにObj-Cクラスを継承し、実装を変更せずにイニシャライザを使用できますか?私はサードパーティ製のlibなので実装を変更することはできません。 – Yang

+0

タイプの問題、それは迅速なバグですか? – Yang

+1

@Yang Nope、Objective-Cコードのバグです。サブクラス化したい場合は、そのメソッドを呼び出さないでください。 – Sulthan

関連する問題