Swift - 具有等变量的结构

时间:2015-12-23 20:43:18

标签: swift variables protocols equatable

我试图实现一个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;
}

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

2 个答案:

答案 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协议没有任何关系。