首页 > 解决方案 > 在单独的类 Swift 中委托

问题描述

我想在单独的类中创建一个代表,例如:

class MapViewAnnotationDelegate: NSObject, SomeDelegate { //...}

然后在我的控制器中我想分配:

someView.delegate = MapViewAnnotationDelegate()

但是代表是零……如何达到这样的效果?我在 Objective-C 中读过一些关于 strong 的内容,但据我所知,strong 在 Swift 中是默认的。

标签: swiftclassdelegates

解决方案


你所做的很好,但你需要一些东西来保存你的实例。delegate传统的属性是weak,因此它们不能确保保留对象。其他东西必须保留它。最常见的解决方案是向拥有的类添加一个属性someView,并MapViewAnnotationDelegate在将其分配为委托之前将其分配给该属性。这样,只要包含对象存在,它就不会被释放。但是任何保留它的东西都可以。

您当前的代码当前执行此操作:

  • 创建 MapViewAnnotationDelegate
  • 将其分配给 someView.delegate
  • 请注意,没有对 MapViewAnnotationDelegate 的强引用(因为 someView.delegate 是弱引用)
  • 销毁 MapViewAnnotationDelegate
  • 将 someView.delegate 设置为 nil

这可能看起来像这样的一种方式:

class Owner {
    let mapViewAnnotationDelegate = MapViewAnnotationDelegate()

    let someView: ...

    init() {
        someView.delegate = mapViewAnnotationDelegate
    }
}

在此配置中,Owner(它是 的所有者someView)在其生命周期内保留委托。


推荐阅读