【问题标题】:Swift - Struct with equatable variableSwift - 具有等价变量的结构
【发布时间】:2015-12-23 20:43:18
【问题描述】:

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

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

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

【问题讨论】:

    标签: swift variables protocols equatable


    【解决方案1】:

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

    if obj1.variable2 is Equatable && obj2.variable2 is Equatable {
    ...
    }
    

    【讨论】:

    • 这种情况下用'is'和使用conformsToProtocol一样,还是报错。
    【解决方案2】:

    (a) AnyObject 不符合 Equatable

    (b) 如果你将某些符合 Equatable 的类向下转换为 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 协议无关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-23
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      • 1970-01-01
      相关资源
      最近更新 更多