Swift:如何定义具有无主(不安全)引用的 UIView 委托(delegate)?

标签 swift delegates

我在UITableView类中找到以下代码,

unowned(unsafe) var delegate: UITableViewDelegate?

所以我想知道如何为UIView定义一个unowned(unsafe)引用委托(delegate),然后当我在我的代码中编写unowned(unsafe)关键字时遇到以下错误类,

/Users/larryhou/Documents/Xcode/AtomicElements/AtomicElements/AtomicElementView.swift:32:25: 'unowned' cannot be applied to non-class type 'AtomicElementViewDelegate?'

protocol AtomicElementViewDelegate:NSObjectProtocol
{
    func didTap(target:AtomicElementView, sender:UITapGestureRecognizer)
}

我只能使用 weak 关键字,但我想保留引用,直到 UIView 被释放。

最佳答案

这两个名称 - unownedweak - 从引用的角度来看是等效的。它们的不同之处在于存在的假设 - 在 Swift 中,只要引用它们,无主实例就被假定总是存在,而弱实例是可选的 - 它们可能存在,也可能不存在,所以您需要使用可选链接或其他一些处理它们的方法。

在 UIKit 中,带有 UIView 子类的委托(delegate)模式是将它们声明为 weak 因为委托(delegate)几乎总是拥有子类所属 View 的 View Controller 。的 subview 。在这种情况下将委托(delegate)声明为强引用会设置引用循环,因此通常使用 weak 关键字声明委托(delegate)。如果您遇到不同的情况,只需省略 weak 关键字即可让您的委托(delegate)被强引用。

在这种特殊情况下,无主(不安全) 是从 ObjC 桥接的产物。

关于Swift:如何定义具有无主(不安全)引用的 UIView 委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26707223/

相关文章:

c# - 如何禁用从一种类型的多个实例订阅事件并只允许一个?

ios - 显示大型 3D Touch 快捷方式小部件

ios - 无法将类型 'UILabel!' 的值转换为预期参数 'type inout String'

ios - 使用 NSFetchedResultsController 更新部分

c# - C# 中的 lambda 创建的委托(delegate)的生命周期是多少?

ios - swift 采用的 objective-c 协议(protocol)

ios - 在单元格中存储第二个值

ios - SceneKit 子节点位置在父节点旋转期间未更改

C# lambda 表达式 : How *Not* to Defer "Dereference"?

c# - 将方法分配给委托(delegate),其中委托(delegate)具有比方法更多的参数