swift - 具有通用委托(delegate)的通用类。如何区分哪个对象的委托(delegate)正在执行回调?

标签 swift generics

MyClass 是一个具有通用委托(delegate)的通用类。 AClass 包含 MyClass 的两个 iVar 实例,并且还实现了 MyClassDelegate。

如果AClass实现了MyClassDelegate,我如何区分哪个对象正在调用接口(interface)?对于非泛型类,== 是可以接受的。

请参阅此代码片段底部的注释和错误消息。

protocol MyClassDelegate: class {
   func myClass<T>(_ myClass: MyClass<T>, valueDidChange value: T)
}

class MyClass<T: Comparable> {
    private var _value: T
    var value: T {
        set {
            delegate?.myClass(self, valueDidChange: newValue)
        }
        get {
            return _value
        }
    }
    var delegate: MyClassDelegate?
    init(value: T) {
        _value = value
    }
}

class AClass {
    private var thing1 = MyClass(value: Int(10))
    private var thing2 = MyClass(value: Int(100))
    private var thing3 = MyClass(value: TimeInterval(10))
    private var thing4 = MyClass(value: TimeInterval(100))

    init() {
        thing1.delegate = self
        thing2.delegate = self
        thing3.delegate = self
        thing4.delegate = self
    }
}

extension AClass: MyClassDelegate {
    func myClass<T>(_ myClass: MyClass<T>, valueDidChange value: T) {
        // This fails to complile
        // Binary operator '==' cannot be applied to operands of type 'MyClass<T>' and 'MyClass<Int>'
        if myClass == thing1 {

        }
        // Binary operator '==' cannot be applied to operands of type 'MyClass<T>' and 'MyClass<TimeInterval>' (aka 'MyClass<Double>')
        else if myClass == thing3 {

        }
    }
}

最佳答案

限制 T输入您的协议(protocol)方法签名 func myClass<T>(...)成为Comparable 。由于您仅将其限制在该协议(protocol)的一个特定扩展中,因此 AClass 中的方法可以采用任何类型的 T ,不仅仅是 Comparable的。

关于swift - 具有通用委托(delegate)的通用类。如何区分哪个对象的委托(delegate)正在执行回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45114426/

相关文章:

ios - UIImagePickerController 检测照片何时进入编辑模式

swift - 多个 ui 元素破坏 WidgetExtension

ios - 从桥接 header 到 Swift 项目的 Obj-C 类调用 Swift 类

ios - Swift 如何创建像 UIViewController 这样的通用 MVP

ios - 如何修复协议(protocol)只能用作通用约束,因为它具有自身或关联的类型要求错误

c# - 如何将通用集合转换为通用祖先集合?

java - Java 中 T(泛型)的实例

ios - JSON创建方法

swift - 如何比较两个没有原始类型的枚举实例?

c# - 使用 List<T> 而不是 IEnumerable<T> 有什么好处?