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?
,这通常是您对委托对象的要求。