簡體   English   中英

Swift:在編譯時將枚舉值映射到類型

[英]Swift: map enum values to types at compile time

我在庫目標中有一個枚舉。 像這樣:

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)

這是不可能的。 這里出發

原始值類型必須符合Equatable協議以及以下文字可轉換協議之一:IntegerLiteralConvertible(用於整數文字),FloatingPointLiteralConvertible(用於浮點文字),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)
}

您可以執行以下操作:

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來確定它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM