でNSClassFromStringを使用して、ネストしたクラスのインスタンス化。私は単純なクラスA
のためにそれを行うことができましたが、NSClassFromString
パラメータに.B
文字列をつけると、それは単にnilを返します。 は、私はこのように定義された入れ子になったクラスを持って迅速
NSClassFromString("\(appName).A") // works...
NSClassFromString("\(appName).A.B") //doesn't work.
は、私は、ネストされたクラス以降では使用できないと仮定しObjective-Cの
NSClassFromString
ちょうどその場合は...入れ子になったクラスの文字列からネストされたクラスを初期化する別の方法があると動作しませんか?あなたはフォーマットが完全に異なっている見ることができるように
"myApp.A" <---- STANDARD CLASS (A)
"_TtCC15myApp13A6B" <----- NESTED CLASS (A.B)
:
// EDIT
は標準クラスと入れ子になったクラスの実行時に異なるフォーマットを返しNSStringFromClass
好奇心どのように逆関数です。 _TtCC15
とはなんですか?なぜ "。"削除されましたか?私はそのフォーマットでクラスをNSClassFromString
に渡すと動作するはずです。
// inheriting NSObject is required for `@objc`, at which point `@objc` is optional
class A: NSObject {
class B: NSObject {
override var description: String { return "foo" }
}
}
let str = NSStringFromClass(A.B.self)
guard let anyClass = NSClassFromString(str)
else { fatalError("no class") }
// cast to a type that defines `init()` so we can instantiate
guard let nsClass = anyClass as? NSObject.Type
else { fatalError("class isn't NSObject") }
// call `.init()`, not `nsClass()`; constructor syntax is for static types only
let instance = nsClass.init()
print(instance) // -> "foo"
にObjCランタイムは、ネストされたクラス(または他の種類を理解していないので、変わり者クラス「名」の文字列がある:私は遊び場で、次の作品(Xcodeの8.2 /スウィフト3)ことがわかり
クラスBを@objcとしてマークするようにしてください: '@objc class B {}'。 –
既に試してみました...私は答えを更新します、それを指摘してくれてありがとう! – MatterGoal
'class B 'の前に' public'キーワードを付けてみてください。この '@objc public class B'のように – NSDmitry