是否可以从字符串中获取Swift类型?

时间:2016-05-19 09:17:50

标签: swift struct

我想知道是否有可能动态获取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的东西,也许?

1 个答案:

答案 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类型(例如StringInt)注册您的类型。然后,您可以使用此类型注册表来使用自定义标识符引用已注册的类型(在本例中为String)。

由于Any.Type本身并不是有用的,我构建了一个接口Foo,通过它我可以访问静态常量bar。因为我知道X.TypeY.Type都符合Foo.Type,所以我强制演员并阅读bar属性。