我有一个Swift通用类,如下所示:
class List<T> {
var value: T
var next: List<T>?
...
}
无论类型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。
谢谢。
答案 0 :(得分:2)
解决方案之一可以是为您的通用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
答案 1 :(得分:1)
List<T>
是泛型类型,List<Int>
和List<String>
是具体类型,但是List
本身不是类型,它只是一个标识符。
因此,说两件事都是List
毫无意义。此外,例如,List<Int>
和List<String>
与某些Foo
和Bar
彼此一样。
如果要推理列表,则需要这两者之间的共同点,即协议或基类。但是,由于您的列表具有通用的元素类型,因此除了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>
之类的东西都是列表,但一无所知其具体的价值类型。