我想知道是否有可能动态获取Swift类型。例如,假设我们有以下嵌套结构:
struct Constants {
struct BlockA {
static let kFirstConstantA = "firstConstantA"
static let kSecondConstantA = "secondConstantA"
}
struct BlockB {
static let kFirstConstantB = "firstConstantB"
static let kSecondConstantB = "secondConstantB"
}
struct BlockC {
static let kFirstConstantC = "firstConstantBC"
static let kSecondConstantC = "secondConstantC"
}
}
可以从变量中获取kSeconConstantC的值。像:
let variableString = "BlockC"
let constantValue = Constants.variableString.kSecondConstantC
类似于NSClassFromString
的东西,也许?
答案 0 :(得分:3)
不,它还不可能(至少作为语言功能)。
您需要的是您自己的类型注册表。即使使用类型注册表,除非您有一个协议,否则您将无法获得static
常量:
var typeRegistry: [String: Any.Type] = [:]
func indexType(type: Any.Type)
{
typeRegistry[String(type)] = type
}
protocol Foo
{
static var bar: String { get set }
}
struct X: Foo
{
static var bar: String = "x-bar"
}
struct Y: Foo
{
static var bar: String = "y-bar"
}
indexType(X)
indexType(Y)
typeRegistry // ["X": X.Type, "Y": Y.Type]
(typeRegistry["X"] as! Foo.Type).bar // "x-bar"
(typeRegistry["Y"] as! Foo.Type).bar // "y-bar"
类型注册表可以使用自定义Hashable
类型(例如String
或Int
)注册您的类型。然后,您可以使用此类型注册表来使用自定义标识符引用已注册的类型(在本例中为String
)。
由于Any.Type
本身并不是有用的,我构建了一个接口Foo
,通过它我可以访问静态常量bar
。因为我知道X.Type
和Y.Type
都符合Foo.Type
,所以我强制演员并阅读bar
属性。