Swift-检查泛型类的类型

时间:2020-05-31 13:13:41

标签: swift generics types

我有一个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"

我希望该过程(或代码段)对ab返回true,对c返回false。

谢谢。

2 个答案:

答案 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>与某些FooBar彼此一样。

如果要推理列表,则需要这两者之间的共同点,即协议或基类。但是,由于您的列表具有通用的元素类型,因此除了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>之类的东西都是列表,但一无所知其具体的价值类型。

相关问题