私はJavaで簡単にできるように、文字列クラス名から新しいクラスをインスタンス化しようとしています。いくつかのグーグルにSwift:infoDictionaryへの感謝
func stringClassFromString(_ className: String) -> AnyClass! {
let namespace = Bundle.main.infoDictionary!["CFBundleExecutable"] as! String;
let cls: AnyClass = NSClassFromString("\(namespace).\(className)")!;
return cls;
}
おかげで、しかし、すぐに私は、このソリューションを試したとしてユニットテストのおかげで:私は、この関数を最後に書いている(EXC_BAD_INSTRUCTION:
func test() {
let myclass = stringClassFromString("NSDate") as! NSDate.Type
let instance = myclass.init()
print(instance)
}
は、私は例外(スレッド1を持っていますコード= EXC_I386_INVOP、サブコード= 0x0))私のテストが行を使用するとすぐ:let namespace ...私はinfoDictionaryの内容を見ようとしましたが、彼は空です。だから私の質問は簡単です、私の辞書が空であるという単体テストのコンテキストのためですか?テスト目的のためにinfoDicionaryをシミュレートするためのメソッドやライブラリ(Android用のrobolectricなど)はありますか?
let namespace = Bundle(for: type(of: self)).infoDictionary!["CFBundleExecutable"] as! String;
そしてtadda、それが働いている:
Stringクラス名からクラスをインスタンス化したいのはなぜですか? Swiftの最大のメリットの1つは静的型チェッカーです。静的型チェッカーは、動的識別子からクラスを作成するようなことをしようとすると完全にスキップします。さらに、Foundationのものの代わりにSwiftのネイティブクラスを使用するようにしてください(例えば、 'NSDate'の代わりに' Date'など)。 –
私は素早く開発と反映を学んでいます。私は学ぶのが面白いと思います。あなたのアドバイスをありがとう、私はFoundationクラスの使用を避けますが、これは単なる例です。 – zed13
スウィフトを学ぶ初期の段階であれば、迷惑をかけないでください。静的型チェッカーを十分に活用しながら本当に解決できない問題が見つかった場合は、最初に型システムの基本を学び、その後、再度見直しをしてください。 –