作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
考虑以下简化的片段:
class Foo<T: Equatable> {
var x: T
init(_ x: T, _ y: T) {
self.x = x
if (x == y) {
// do something
}
}
}
我希望这个类适用于在某种程度上具有可比性的所有类型的 T
。理想情况下,如果 T 是一个对象,它会比较身份,并直接比较符合 Equatable
的所有其他内容。
例如,上面的代码不适用于 Array
。如果我将 Equatable
更改为 AnyObject
并将 ==
更改为 ===
那么它不适用于 Int
s。我该如何解决这个问题?我考虑过创建自己的协议(protocol),但后来我想不出如何为所有符合 Equatable
的类型实现它。
编辑:
我不知道它会在 Mac 上运行,因为我在 Linux 上并且当我尝试编译时
Foo<[Int]>([1, 2], [1, 2])
我收到以下错误:
error: type '[Int]' does not conform to protocol 'Equatable'
Foo<[Int]>([1, 2], [1, 2])
^
最佳答案
一个简单的解决方案是简单地为 Equatable
元素的数组添加另一个初始化程序。
class Foo<T: Equatable> {
init(_ x: T, _ y: T) {
if (x == y) {
print("Initialization by equal equatable types.")
}
}
init(_ x: [T], _ y: [T]) {
if (x == y) {
print("Initialization by equal arrays of equatable types.")
}
}
}
let a = Foo<Int>(1, 1)
/* Initialization by equal equatable types. */
let b = Foo<Int>([1, 2, 3], [1, 2, 3])
/* Initialization by equal arrays of equatable types. */
关于swift - 如何比较 Swift 中的泛型对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35038178/
我是一名优秀的程序员,十分优秀!