簡體   English   中英

如何在Swift中檢查Enum類型?

[英]How to check for Enum types in Swift?

我正在編寫一個序列化程序,可以序列化枚舉和其他Swift類型(字符串,對象等)。 所以我需要檢查傳遞給我的序列化程序的Any參數是否是Enum或其他東西。 似乎在Swift中執行此操作的唯一方法是使用反射。 下面的代碼是否合理或是否有更好的方法來檢查枚舉類型?

enum Things {
    case Thing1
    case Thing2
}

let something:Any = Things.Thing1
let mirror = Mirror(reflecting: something)
if (mirror.displayStyle == .Enum) {
    print("Reflected type is Enum") // works
}
enum Things {
    case Thing1
    case Thing2
}

let something:Any = Things.Thing1

something.dynamicType == Things.self // true

根據討論更新..

protocol P {}
enum Things:P {
    case Thing1
    case Thing2
}
enum Things2:P{
    case Things21
}

let something:Any = Things.Thing1
something.dynamicType == Things.self // true
if let p = something as? P {
    print(true)
}

let somethingelse: Any = Things2.Things21
if let p = somethingelse as? P {
    print(true)
}

由於Mirror.displayStyle是可選的枚舉,因此最好在同一語句中使用條件展開和類型檢查。

您可以通過.equals方法擴展Mirror.displayStyle ,以便在您想要經常進行枚舉檢查時隨時訪問它。

extension Mirror.DisplayStyle {
    func equals(displayCase: Mirror.DisplayStyle) -> Bool {
        return self == displayCase
    }
}

enum Things {
    case Thing1
    case Thing2
}

let something:Any = Things.Thing1
let mirror = Mirror(reflecting: something)

/* short form: using nil coalescing and ternary conditional operator */
mirror.displayStyle?.equals(.Enum) ?? false ? print("Reflected type is an Enum") : ()

/* another option: or using if-let */
if let _ = mirror.displayStyle?.equals(.Enum) {
   print("Reflected type is an Enum")
}

請注意,您不需要顯式地創建和存儲Mirror實例此檢查,但可以做到這一切在一個表達式,對於一些比如something類型的Any

Mirror(reflecting: something).displayStyle?.equals(.Enum) ?? false ? print("Reflected type is an Enum") : ()

最后,如果您只是根據不同Any實例的DisplayStyle案例做一些簡單的操作,那么您可以創建一個函數來切換此枚舉的不同情況。 下面,“簡單動作”只打印案例。

//... 

func foo(mirror: Mirror) {
    if let dispStyle = mirror.displayStyle {
        switch(dispStyle) {
        case .Class: print("Reflected type is a Class")
        case .Collection: print("Reflected type is a Collection")
        case .Dictionary: print("Reflected type is a Dictionary")
        case .Enum: print("Reflected type is an Enum")
        case .Optional:  print("Reflected type is an Optional")
        case .Set:  print("Reflected type is a Set")
        case .Struct:  print("Reflected type is a Struct")
        case .Tuple:  print("Reflected type is a Tuple")
        }
    }
}

let something: Any = Things.Thing1
foo(Mirror(reflecting: something))

另請參見Mirror.DisplayStyle的語言參考

暫無
暫無

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

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