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

是否可以从字符串中获取Swift类型?,swift,struct,Swift,Struct,我想知道是否有可能动态获取Swift类型。例如,假设我们有以下嵌套结构: struct Constants { struct BlockA { static let kFirstConstantA = "firstConstantA" static let kSecondConstantA = "secondConstantA" } struct BlockB { static let kFirstConstantB = "firstConstant

我想知道是否有可能动态获取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"
  }
}
可以从kseconcontc(从变量)中获取值。比如:

类似于
NSClassFromString
的东西,也许?

不,现在还不可能(至少作为一种语言功能)

您需要的是您自己的类型注册表。即使使用类型注册表,您也无法获取
静态
常量,除非您有相应的协议:

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"
类型注册表是使用自定义的
散列类型(例如
字符串
Int
)注册您的类型的东西。然后,您可以使用此类型注册表使用自定义标识符引用已注册的类型(在本例中为
字符串


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

值不能用作标识符,按照我的想法,我认为不可能使用like if(variableString==“BlockC”)然后为你的工作做一些事情,但背后的想法是减少代码。我更喜欢我提到的(如果存在)解决方案,而不是为每种情况编写几个if-else。理论上的备选方案:使用类和子类
NSObject
,然后通过运行时内省(
Mirror(…)
)和
NSObject
:s键值访问来设置/获取子类型的属性。但与luk2302相同的建议在这里也适用;不要在生产中使用这种溶液。酷!你能解释一下发生了什么吗?谢谢,我会尝试按照这种方式来做。这很简单,不过请注意,如果你知道给定注册表中的类型总是符合给定的协议,那么你应该使注册表
[String:Foo.Type]
,以消除难闻的强制向下转换。
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"