簡體   English   中英

Swift - 檢查通用 class 的類型

[英]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"

我希望過程(或代碼片段)為ab返回 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>與某些FooBar一樣彼此不同。

如果您想對列表進行推理,則需要這兩者之間的共同點,即協議或基礎 class。 但是,由於您的列表具有通用元素類型,因此在具有不同元素的任何兩個列表之間實際上幾乎沒有什么共同點,除了countprint之類的函數。

所以你可以做這樣的事情(正如另一個答案中正確建議的那樣)

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.

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