加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

swift – 为类创建泛型委托

发布时间:2020-12-14 04:30:33 所属栏目:百科 来源:网络整理
导读:假设我的课程非常简单: class BoxT { var boxedObject:T init(object: T) { self.boxedObject = object }} 我现在想要实现的是添加委托,它可以告诉我框中的值已经改变: protocol BoxDelegateT: class { func valueInBoxChanged(box: BoxT) - Void}class Bo
假设我的课程非常简单:

class Box<T> {
  var boxedObject:T

  init(object: T) {
    self.boxedObject = object
  }
}

我现在想要实现的是添加委托,它可以告诉我框中的值已经改变:

protocol BoxDelegate<T>: class {
    func valueInBoxChanged(box: Box<T>) -> Void
}

class Box<T> {
    var boxedObject: T {
        didSet {
            self.delegate?.valueInBoxChanged(self)
        }
    }
    weak var delegate: BoxDelegate<T>?

    init(object: T) {
        self.boxedObject = object
    }
}

此代码当然不起作用,因为我们没有通用委托.我可以使委托成为一个带闭包的结构,但它有点难看的解决方案.我应该如何在Swift中做这些事情?

解决方法

由于使用Swift的类型约束协议,您可能无法执行上面尝试执行的操作.你可以做的是在设置委托时创建一个闭包并稍后调用闭包.

这将使您的案例在某种程度上更简单,

protocol BoxDelegate: class {
    associatedtype T
    func valueInBoxChanged(box: Box<T>) -> Void
}

class Box<T> {

    var notifyClosure: (Void -> Void)?

    var boxedObject: T {
        didSet {
            self.notifyClosure?()
        }
    }

    func setBoxDelegate<M where M:BoxDelegate,M.T == T>(delegate: M) {
        notifyClosure = {
            delegate.valueInBoxChanged(self)
        }
    }

    init(object: T) {
        self.boxedObject = object
    }
}

因此,您不需要添加带有闭包的额外结构来使其工作.相反,您不会为BoxDelegate创建属性,而是创建一个方法来设置它并基于此创建一个闭包对象.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读