协议(protocol) : operator '===' cannot be applied to operands of type '_' and 'Self.T' 中的 Swift 泛型

标签 swift generics swift-extensions swift-protocols

我正在尝试使用 Swift 2 构建一个简单的观察者混合。 这里只是相关部分。

protocol Observable{

    typealias T 
    var observers:[T] { get set }
    mutating func removeObserver(observer:T)
}

为了创建 mixin,我使用了一个扩展:

extension Observable{

    mutating func removeObserver(observer:T){
        let index = self.observers.indexOf{ $0 === observer }
        if let _ = index{
            self.observers.removeAtIndex(index)
        }
    }   
}

这会产生编译器错误:二元运算符“===”不能应用于“_”和“Self.T”类型的操作数

您能向我解释一下为什么会出现此错误吗?

最佳答案

“identical-to”运算符===只能应用于引用 类型,即的实例。一种可能的解决方案是 将泛型类型 T 限制为 AnyObject(协议(protocol)) 所有类都隐式符合):

protocol Observable {

    typealias T : AnyObject
    var observers:[T] { get set }
    mutating func removeObserver(observer:T)
}

extension Observable {

     mutating func removeObserver(observer:T) { 
        if let index = (self.observers.indexOf { $0 === observer }) {
            self.observers.removeAtIndex(index)
        }
    }   
}

或者,将 T 限制为 Equatable 类型(这意味着 必须为该类型定义 == 运算符):

protocol Observable {

    typealias T : Equatable
    var observers:[T] { get set }
    mutating func removeObserver(observer:T)
}

extension Observable {

     mutating func removeObserver(observer:T) { 
        if let index = self.observers.indexOf(observer) {
            self.observers.removeAtIndex(index)
        }
    }   
}

关于协议(protocol) : operator '===' cannot be applied to operands of type '_' and 'Self.T' 中的 Swift 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36161468/

相关文章:

objective-c - 在 Swift 扩展文件中访问 Obj-C 属性

swift - 使用键和值约束扩展字典

Swift 闭包遗漏示例?

ios - Firebase 数据返回 Nil

ios - 使 iOS 应用程序出现在移动数据中,位于 'use mobile data for' 下

ios - 使用 UIImagePickerController 选取图像后如何从 PhotoLibrary 中删除图像

java - 将通用列表转换为数组

swift - 是否可以为 UIDatePicker.Mode 编写 Swift 扩展

java - 在不知 Prop 体类型的情况下实例化对象

entity-framework - ADO EF Code First 通用中间类继承映射