2016-09-09 13 views
0

目的変数Cから、および初期化パラメータが省略可能なスウィフトクラスから新しいスウィフトクラスオブジェクトを作成しようとしています。nilプロパティを持つ新しいスウィフトクラスオブジェクトを割り当てると、nilオブジェクトが返されます

これはスウィフトから、私は初期化しようとしているクラス、

@objc 
public class ClassStatus: NSObject { 
    public private(set) var prop1: DemoClass? 
    public private(set) var prop2: DemoClass2? 

    public override var description: String { 
     return "\(prop1)" 
    } 

    public init(prop: DemoClass?) { 
     super.init() 
     self.prop1 = prop 
    } 

    public convenience init(propA: DemoClass?, propB: DemoClass2) { 
     self.init(prop: propA) 
     self.prop2 = propB 
    } 
} 

で、

let statusObj = ClassStatus(prop: nil) 

のObjective-C

から
ClassStatus *connState = [[ClassStatus alloc]initWithProp:nil]; 

作成されたオブジェクトがでnilである理由どちらのケースでも、目的のプロパティを持つ有効なオブジェクトをnilとして返すのではなく、

EDIT :: オブジェクトを印刷すると、nilとして表示されます。ここでは、実際にオブジェクトを操作しようとしていて、それが無限であろうと有効であっても、オブジェクトのプロパティを探します。ここでのケースは、プロパティがnilである有効なオブジェクトを作成する代わりに、オブジェクトがnilとして表示される理由です。

EDIT 2:これは有効な質問ではありません。これは、descriptionメソッドのオーバーライドのために実際にはnilの結果が起こっているためです。オブジェクトの作成はそのまま実行されます。

+0

は再現できないことを、このリンクをチェックすることができます。 'NSLog(@" connState =%p、prop1 =%p "、connState、connState.prop1);' connState = 0x1020003f0、prop1 = 0x0'を出力します。 –

+0

'po connState'のように、オブジェクトをコンソールに直接印刷できますか?私が得ているのはコズです。オブジェクトを使用しようとすると、それは無しと表示されます。 –

+0

私はNSLogをデバッガコンソール以上に信頼しています。おそらくオブジェクトがまだデバッガで印刷しようとした時点で作成されていないでしょうか? –

答えて

0

いくつかのこと:あなたがNSObjectのサブクラス化されているので

@objcが必要とされていません。 また、 'private(set)'ではなく 'private(set)'を実行してください。

最終、より重要なのは、あなたのinitメソッドをに変更する必要があります。我々は、オブジェクトを印刷しようとすると、直前でsuper.init()一般

+0

'prop1'はデフォルト値として' nil'を持つ*オプション*です。したがって、 'super.init()'を最初に呼び出すと動作します。それ以外の場合、コンパイラは不平を言うでしょう。 –

+0

コードはフレームワークの一部であり、そのプロパティはフレームワーク外でアクセスできるため、パブリックプライベート(集合)のパブリックが意図されています。公開していないため、フレームワーク外ではアクセスできません。また、プロパティはオプションとして宣言されているため、super.init()の前にプロパティを初期化する必要はありません。それがオプションであると宣言していなければ、superの前に初期化するだけでよい。それでも、それは問題を解決するddnt。 : –

1

を呼び出すには、あなたのメンバーを初期化する必要があります

public init(prop: DemoClass?) { 
    self.prop1 = prop 
    super.init() 
} 

既定では、descriptionプロパティのオブジェクトの説明が出力されます。

実はあなたは、コンソールまたは印刷文でstatusObjを印刷しようとしている時はいつでもそう、それは財産descriptionをオーバーライドから来てnilを返し、prop1でスーパークラス(NSObject)プロパティdescriptionをオーバーライドしています。だから、

あなたClassStatusクラスからそのdescription変数を削除すると、あなたはprintまたはconsole文の実際の変数を見ることができます。そうでない場合はで初期化して、なしのnilの説明を取得する必要があります。

1

マーティン・Rはそれだけで説明を印刷していると言っています。ClassStatusは開始され、nilではありません。これは解決策ではありませんが、コメントを投稿するには十分な評判がありません。 :-)ここ

+0

以下のコードをコメントアウトするとオブジェクトが表示されます。public override var description:文字列{ return "\(prop1)" } – user3608500