0

我正在尝试实现一个结构,它是 Equatable 并且有一个 AnyObject 类型的变量(在本例中为“variable2”),它可能是或不是 equatable。

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;
}

我尝试了一些不同的方法,但没有设法让它工作。有没有人对此有解决方案?解决第一种情况将是最好的情况,但第二种情况也可能满足我的需求。

4

2 回答 2

0

为什么不使用“is”运算符:

if obj1.variable2 is Equatable && obj2.variable2 is Equatable {
...
}
于 2015-12-23T20:58:13.697 回答
0

(a) AnyObject 不符合 Equatable

(b) 如果您将某些符合 Equatable 的类向下转换为 AnyObject,则结果是 NOT equatable!!

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 协议无关。

于 2015-12-23T21:15:43.683 回答