2017-12-10 12 views
2

Sword 3でクラスを作成して、Cordovaプラグインを実装しようとしています。私はこのビルドと実行を持っていますが、クラスのプロパティにアクセスするたびにアプリケーションがクラッシュします。私playersプロパティが使用されている場合しかし、結果はヌルのように見えるアドレスで、EXC_BAD_ACCESS例外ですObjective Cコードで構築したときにSwiftクラスのプロパティが初期化されない

@objc(DSFMediaCentre) 
class DSFMediaCentre : CDVPlugin 
{ 
    var players = [UUID:DSFPlayerHandler](); 
    ... 
} 

@objc(DSFMediaCentre) 
class DSFMediaCentre : CDVPlugin 
{ 
    var players :[UUID:DSFPlayerHandler]; 
    override init() { 
     players = [:]; 
    } 
    ... 
} 

:私はクラスの初期化の二つの方法を試してみましたポインタ逆参照。

オブジェクトは、私は全くとまったく知識がない言語であるObjective Cのコードで作成されているが、私は、これは、それを作成する行であると思う:

obj = [[NSClassFromString(className)alloc] initWithWebViewEngine:_webViewEngine]; 

CDVPluginクラスにはコメントが含まれていますinitWithWebViewEngineを無効にするべきではないと述べています(実際にCDVPlugin.mファイルで宣言されていますが、CDVPlugin.hには記載されていないため、このメソッドをオーバーライドすることはできません。それについて知るために)、むしろ初期化コードはと呼ばれる方法に置かれるべきです代わりに。しかし、私がそれを行うと、コンパイラエラー(「クラスDSFMediaCentreに初期化子がありません」)が表示されます。

さらに、私は後ろに私のinit()方法を入れて、このように、pluginInitialize()を呼び出すようにそれを設定した場合:

エラーはその後、プロパティ 『self.players』」に変更

はでsuper.initコールで初期化されていません

override init() { 
    super.init(); // necessary otherwise next line is an error 
    pluginInitialize(); 
} 
override func pluginInitialize() { 
    players = [:]; 
} 
"

このクラスを正しく初期化するにはどうすればよいですか?

+0

非nulableおそらく、あなたはスウィフト4を使用していることはありません。 Objective-Cから@objcでアクセスされるクラス+ ivarsに接頭辞を付ける必要がありますか? – Rog

+0

いいえ、私はスイフト3を使用しています。それを質問に追加します。速い4をまだ見ていない。 – Jules

答えて

1

言語で必要とされる厳密な初期化システムと、使用しているフレームワークで使用されているプロシージャとの間に不一致があります。

スウィフトでは、a)オブジェクト構築の一部としてプロパティを初期化し、b)その型のスーパータイプに連鎖させる必要があります。しかし、タイプCDVPluginがあなたのために建設を行っています。あなたはそれをカスタマイズする能力を持っていません。 (これは、Swiftと同じコンパイル時の制限がないため、ObjCではより意味があります)。

状況はnibファイルからオブジェクトをアンパックする場合と似ています。その場合も、あなたのオブジェクトを構築しているペン先のロードシステムであるため、イニシャライザをカスタマイズする能力はありません。あなたのタイプは常にinit(coder:)によって構成されます。特定の意味では、初期化ポイントがさらに下に移動してawakeFromNib()などになります。アーカイブ内の他のオブジェクトへのアウトレットは、オプションで宣言され、通常は暗黙的にアンラップされます。

ここでも同じ解決策が役立ちます。 pluginInitialize()を初期化ポイントとみなすべきです。言語は、初期化ポイントで満たされていないため、プロパティはオプションである必要があります。したがって、プロパティをIUO:

@objc(DSFMediaCentre) 
class DSFMediaCentre : CDVPlugin 
{ 
    var players :[UUID:DSFPlayerHandler]! 
    override func pluginInitialize() { 
     players = [:]; 
    } 
} 

とする必要があります。

1

他のソリューションは、そう

lazy var players :[UUID:DSFPlayerHandler] = [:] 

怠惰なキーワードを使用することで、あなたは初期化子で選手を初期化する必要がありますが、まだわからプレイヤーは常に

関連する問題