我在图书馆目标中得到了一个枚举。像这样:
enum SomeEnum {
case EnumValue1
case EnumValue2
case EnumValue3
}
我的应用中有一些结构。像这样:
struct Struct1 {...}
struct Struct2 {...}
struct Struct3 {...}
我的目标是在编译时将此结构映射到我的应用程序中的枚举值。 像这样:
extension SomeEnum {
case EnumValue1(Struct1)
case EnumValue2(Struct2)
case EnumValue3(Struct2)
}
但显然我无法在扩展程序中添加相关值。
库中的原始枚举不应该知道我的应用程序结构。我想在应用程序端执行此映射。所以我无法修改我原来的枚举。我怎样才能做到这一点?
编辑:抱歉,我错过了一个用例示例。我想为每个枚举值创建一个对应结构类型的对象:
func createStruct<T>(type: T.Type) {
return T()
}
用法:
let enumValue = SomeEnum.EnumValue2
//here I should use an invented way of mapping enum value to struct:
let object = createStruct(enumValue.struct)
答案 0 :(得分:1)
这是不可能的。来自here
的Qute原始值类型必须符合Equatable协议和其中一个 以下文字可转换协议:IntegerLiteralConvertible 对于整数文字,FloatingPointLiteralConvertible for 浮点文字,字符串文字的StringLiteralConvertible 包含任意数量的字符,和 对于字符串文字,ExtendedGraphemeClusterLiteralConvertible 只包含一个字符。
即使你试图实现Equatable
协议 - 它也行不通。
struct Struct1 : Equatable {}
func ==(lhs: Struct1, rhs: Struct1) -> Bool {
return true // some code here
}
enum SomeEnum {
case EnumValue1 = Struct1
}
此代码无效。也许你应该创建一些与你的结构相匹配的String
。
UPD:您可以使用docs中所述的关联值。它将在编译期间而不是运行时。
struct Struct1 {}
struct Struct2 {}
struct Struct3 {}
enum SomeEnum {
case EnumValue1(Struct1)
case EnumValue2(Struct2)
case EnumValue3(Struct3)
}
答案 1 :(得分:0)
你可以用:
extension SomeEnum {
func getStruct() -> Any.Type {
switch self {
case .EnumValue1:
return Struct1.self
case .EnumValue2:
return Struct2.self
case .EnumValue3:
return Struct3.self
}
}
}
let structType = SomeEnum.EnumValue1.getStruct()
但它似乎没用,因为您不知道structType
的类型,必须再次使用switch...case
来确定它。