你可以這樣做:
let things: [Any] = [intThing, stringThing]
Thing
不是它自己的有效的類型。 Thing<String>
是一種類型,而Thing<Int>
是另一種類型,您不能在數組中混用不同的類型。
你有沒有注意到,即使let things: [Thing]
無法編譯?
我認爲,你可能嘗試做會與相關的值枚舉更好的服務器。
struct MyStruct<T> {
let property: T
init(property: T) {
self.property = property
}
}
enum Thing {
case int(Int)
case string(String)
case intStruct(MyStruct<Int>)
}
// creation
let myInt = Thing.int(2)
let myString = Thing.string("string")
let myIntStruct = Thing.intStruct(MyStruct<Int>(property: 3))
// down side is that you need a 'case' clause to retrieve the data
switch myIntStruct {
case let .int(value):
print("have a int: \(value)")
case let .string(value):
print("have a string: \(value)")
case let.intStruct(value):
print("have a intStruct\(value)")
}
// An array of Thing
let things: [Thing] = [myInt, myString, myIntStruct]
nice article about advance enum trick here
在這種file約包裝的plist數據到一個單一的結構中,存在使用了的EntityType枚舉的。
你可以向任何一個枚舉值相關聯,但它必須是一個完全合格的類型。所以你不能使用MyStruct,因爲它不是完全合格的,你需要使用MyStruct<Int>
來完全符合條件。這意味着您需要爲每個想要與MyStruct一起使用的通用類型創建一個案例。
也就是說只要你可以用通用的方法去。
我不確定你想要做什麼。但是,如果你想達到某種多態性的依賴上T
操作,但不要使用T
作爲輸入輸出也不應該讓你的Thing
實現協議,使該協議的一個數組,並打電話給你的多態方法上的方法協議。
不幸的是,仿製藥尚未使用這種模式。 – PeejWeej