Arrays 如何在Swift中从协议数组中删除元素?

Arrays 如何在Swift中从协议数组中删除元素?,arrays,swift,protocols,xcode6,Arrays,Swift,Protocols,Xcode6,斯威夫特的协议实现现在真的让我抓狂。我在自定义协议上定义了一个数组observators,我正试图从给定元素的数组中删除一个元素,但Swift抱怨observation没有实现可识别(我认为这实际上是我自己的另一个协议,除非还有一个叫做它的系统协议)。我只想做一个引用比较并删除实际对象。我不关心对对象执行任何类型的比较 var observers = [Observing]() func removeObserver( observer: Observing ) { for i in

斯威夫特的协议实现现在真的让我抓狂。我在自定义协议上定义了一个数组
observators
,我正试图从给定元素的数组中删除一个元素,但Swift抱怨
observation
没有实现
可识别
(我认为这实际上是我自己的另一个协议,除非还有一个叫做它的系统协议)。我只想做一个引用比较并删除实际对象。我不关心对对象执行任何类型的比较

var observers = [Observing]()

func removeObserver( observer: Observing ) {
    for i in 0 ..< self.observers.count {
        if self.observers[i] == observer { // <='Observing' is not convertible to 'Identifiable'...?
            self.observers.removeAtIndex(i)
            break
        }
    }
}
var观察员=[观察]()
func removeObserver(观察者:观察者){
对于0中的i..如果self.observators[i]==观察者{/如果要比较两个观察点是否指向同一实例,请改用===运算符。这要求观察者必须符合任何对象。要求观察仅适用于任何对象的简单方法是在协议声明中添加@class_协议前缀。

运算符检查valSwift中的ue相等,因为它没有默认实现。您需要的是引用相等,您可以使用Swift中的
==
!==
获得引用相等

有关更多详细信息,请参阅

身份运算符 因为类是引用类型,所以多个常量和变量可以在幕后引用同一个类的单个实例。(对于结构和枚举来说,情况并非如此,因为它们总是在分配给常量或变量或传递给函数时被复制。)

有时,找出两个常量或变量是否引用了一个类的完全相同的实例可能很有用。为了实现这一点,Swift提供了两个标识运算符:

与(===)相同 与(!==)不相同

请注意,要使
==
操作符工作,对象必须符合
AnyObject
协议。您可以通过在协议后面加“:class”来保证这一点,如下所示:

protocol SomeProtocol : class { ... }

observer对象是否有==比较aka的覆盖,允许您检查对象是否实际相等?不,没有,但为什么它需要一个?我只想执行引用相等比较。不能在Swift中比较对象吗?原因由ahruss提到。很高兴您找到了您正在寻找的答案或者。在目标c中,有==和isEquals的分隔…在swift中没有isEquals,因此==相当于isEquals,而===用于指针比较。哦,亲爱的,我不知道swift有一个
===
操作符(是的,我读过这本书,但一定跳过了这部分)。感谢您的编辑。我喜欢
@class_协议
胜过
@objc
,因为我试图保持纯粹的敏捷。在beta5中,它应该是
协议名称:class{…}
@class_-protocol
不是这样做的正确方法吗,不是@objc吗?看起来是这样。我没有意识到。谢谢你的提示
@class_-protocol
前缀不推荐,新语法:
协议名称:class{}