我试图实现一个Equatable的结构,并且有一个AnyObject类型的变量(在这个例子中是变量2'),它可能是不相等的。
struct MyStruct : Equatable{
var variable1 : String;
var variable2 : AnyObject;
}
func == (obj1 : MyStruct, obj2 : MyStruct) -> Bool {
if(obj1.variable2.conformsToProtocol(Equatable) && obj2.variable2.conformsToProtocol(Equatable)) {
//...
} else {
//...
}
return ...
}
起初我试图检查variable2是否符合协议Equatable,但这样做会导致编译错误。
在另一种方法中,我试图改变' variable2
'到Equatable
,但即便如此,我仍然有一个错误告诉我它只能用作通用约束。
struct MyStruct : Equatable{
var variable1 : String;
var variable2 : Equatable;
}
func == (obj1 : MyStruct, obj2 : MyStruct) -> Bool {
return obj1.variable2 == obj2.variable2;
}
我尝试了一些不同的方法,但没有设法让它发挥作用。有没有人有这方面的解决方案?解决第一种情况是最好的情况,但第二种情况也可能满足我的需求。
答案 0 :(得分:0)
为什么不使用“是”运算符:
if obj1.variable2 is Equatable && obj2.variable2 is Equatable {
...
}
答案 1 :(得分:0)
(a)AnyObject不符合Equatable
(b)如果你向下转换一些符合Equatable to AnyObject的类, 结果不等于!!
class C: Equatable {
var i: Int
init(value: Int){
i = value
}
}
func ==(lhs: C, rhs: C)->Bool {
return 2 * lhs.i == rhs.i
}
let c1 = C(value: 1)
let c2 = C(value: 2)
c1 == c2 // true
let a1 = c1 as AnyObject
let a2 = c2 as AnyObject
// or if you want
// let a1: AnyObject = c1
// let a2: AnyObject = c2
// a1 == a2 // error!!!
a1 as? C == a2 as? C // true
换句话说,您无法比较两个AnyObject。您可以检查对AnyObject的两个引用是否相同(表示相同的实例)。但这与Equatable协议没有任何关系。