swift 存放多型別的容器

Inlight發表於2017-12-21

常見問題

在 swift 中容器都是泛型,一個容器只能存放同一型別的元素

public struct Array<Element> : RandomAccessCollection, MutableCollection
public struct Dictionary<Key, Value> : Collection, ExpressibleByDictionaryLiteral where Key : Hashable
public struct Set<Element> : SetAlgebra, Hashable, Collection, ExpressibleByArrayLiteral where Element : Hashable
複製程式碼

但如果想要把不同的型別放在同一個容器中我們可以使用 Any。

let arry: Array<Any> = ["hello", 99, ["key":"value"]]
複製程式碼

這樣將陣列型別定義成 Any 之後我們可以將任意型別新增進陣列,也可以從陣列中取出的值轉換成任意型別。但這樣做是十分危險的,取值時一旦型別轉換錯誤再呼叫該型別的方法後就容易造成不必要的 crash 。

如何處理

如果確實存在這種多型別資料放在同一個陣列中的需求時,建議使用帶有值的 enum 來處理。

enum TypeOfMyArr {
   case stringValue(String)
   case intValue(Int)
   case dicValue(Dictionary<String, String>)
}
複製程式碼
    let array: Array<TypeOfMyArr> = [TypeOfMyArr.stringValue("hello"), TypeOfMyArr.intValue(99), TypeOfMyArr.dicValue(["key":"value"])]
    
    for item in array {
        switch item {
        case let .stringValue(s):
            print(s + "world")
        case let .intValue(i):
            print(i + 1)
        case let .dicValue(dic):
            print(dic)
        }
    }
複製程式碼

這樣就可以愉快的在陣列中使用不同的資料型別了。

相關文章