[英]Swift - checking type of a generic class
我有一個 Swift 通用 class 如下:
class List<T> {
var value: T
var next: List<T>?
...
}
我想檢查一些 object 是否是此 class 的實例,無論 T 類型是什么。 例如,如果我有:
let a = List<Int>(2, 3)
let b = List<Any>(5, List<String>("a", "b"))
let c = "something which is not a list"
我希望過程(或代碼片段)為a
和b
返回 true ,為c
返回 false 。
提前致謝。
一種解決方案可以是為您的通用List
使用協議:
protocol AnyList {}
class List<T>: AnyList {
var value: T
var next: List<T>?
...
}
func isList<T>(_ object: T) -> Bool {
object is AnyList
}
let a = List<Int>(value: 2)
let b = "something which is not a list"
print(isList(a)) // true
print(isList(b)) // false
List<T>
是泛型類型, List<Int>
和List<String>
是具體類型,但List
本身不是類型,它只是一個標識符。
所以,說兩件事都是List
是沒有意義的。 此外,例如, List<Int>
和List<String>
與某些Foo
和Bar
一樣彼此不同。
如果您想對列表進行推理,則需要這兩者之間的共同點,即協議或基礎 class。 但是,由於您的列表具有通用元素類型,因此在具有不同元素的任何兩個列表之間實際上幾乎沒有什么共同點,除了count
或print
之類的函數。
所以你可以做這樣的事情(正如另一個答案中正確建議的那樣)
protocol AnyList {
func count() -> Int
func print() -> Void
// but, var value: T wouldn't work
}
class List<T>: AnyList {
...
}
但是您可以看到,與列表的作用相比,普通AnyList
的用途有限。
最后,您需要問自己接下來要對任何類型的“列表”做什么,並得出結論,像List<Int>
和List<String>
這樣的東西都是列表,但對它們的具體值類型一無所知。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.