Swift 快速检查符合协议的两个对象是否参考相同

Swift 快速检查符合协议的两个对象是否参考相同,swift,types,Swift,Types,我有一个协议,它构成了下面示例中许多类的基础,StaticFile和RemoteFile。我引用了一个指向协议的变量 protocol ContainerDelegate {} protocol FileProtocol { var delegate: ContainerDelegate? { get set } } class StaticFile: NSObject, FileProtocol { var delegate: ContainerDelegate? } cl

我有一个协议,它构成了下面示例中许多类的基础,
StaticFile
RemoteFile
。我引用了一个指向协议的变量

protocol ContainerDelegate {}

protocol FileProtocol {
    var delegate: ContainerDelegate? { get set }
}

class StaticFile: NSObject, FileProtocol {
    var delegate: ContainerDelegate?
}
class RemoteFile: NSObject, FileProtocol {
    var delegate: ContainerDelegate?
}

class Container: NSObject, ContainerDelegate {
    var item: FileProtocol

    override init() {}

    func something() {
        if item.delegate !== self { // This fails
        }
    }
}

我甚至不关心类型,我只想看看委托是否不是当前对象(通过引用)。使故障线路正常工作的最佳方法是什么?

您应该尝试向上投射
委托,然后检查是否相等:

func something() {
    if item.delegate as? Container !== self {
        print("hi")
    }
}
完整的工作代码示例

protocol ContainerDelegate {}
protocol FileProtocol {
    var delegate: ContainerDelegate? { get set }
}

class StaticFile: NSObject, FileProtocol {
    var delegate: ContainerDelegate?
}

class Container: NSObject, ContainerDelegate {
    var item: FileProtocol

    func something() {
        if item.delegate as? Container !== self {
            print("hi")
        }
    }

    override init() {
        item = StaticFile()
    }
}

let c = Container()
let c2 = Container()

c.item.delegate = c2
c.something() // hi gets printed

c.item.delegate = c
c.something() // hi does **not** get printed

这里的问题是,
ContainerDelegate
不要求一致性类型为参考类型。您可以使用
=
编写符合此协议的
结构==对于结构没有意义。(
==
!==
运算符采用
AnyObject?
参数,并且只有类对象可以作为AnyObject传递。)

解决此问题的一种方法是使用
protocolcontainerdelegate:class{}
,它需要引用语义,并允许您编写
item.delegate!==self


正如luk2302指出的,另一种方法是,由于您只关心对象是否与
self
相同,因此在比较之前,您可以首先尝试将其转换为与
self
相同的类型。

您可能应该使用
=。能否提供完整的运行代码示例?无法使用
=,我的类是有状态的。完成上述操作后,代码将显示一个错误。如果您想通过引用进行比较,那么@luk2302的答案就是正确的。类似的问题:。实际上,这个答案也有很大帮助!我只是遇到了一个无法向上转换的情况,因为我想引用比较两个文件协议。使用
protocol X:class
的另一个好处是,它允许您使用
弱var delegate:X?
,这通常是您对委托对象的要求。