繁体   English   中英

为什么Apple可以声明没有@objc的可选协议函数,以及无主的可选变量,但我不能?

[英]Why can Apple declare optional protocol funcs without @objc, and unowned optional variables, but I can't?

我不确定如何在swift中声明委托。 所以我检查了Apple的UITableView代码(通过命令+点击XCode中的UITableView),发现一些奇怪的东西。

以下是UITableView的委托的声明:

在此输入图像描述

委托是一个无主(不安全)的可选值 ,但根据Apple的文档

在此输入图像描述

有人说

假定无主参考始终具有值

但是,代表当然可以是零,即没有价值。 实际上,委托被声明为UITableViewDelegate? ,这是一个可选值。 不是有问题吗?

此外,以下是UITableViewDelegate的声明:

在此输入图像描述

显然有几个可选功能。 根据Apple的文档

在此输入图像描述

有人说

只有在协议标记为@objc属性时,才能指定可选的协议要求

但是,UITableViewDelegate未标记为@objc。 不是有问题吗?

以下是我试图复制Apple定义协议和委托的方法的代码:

protocol CSImagePickerDelegate : NSObjectProtocol {
    optional func imagerPickerDidPickImage(picker: CSImagePicker, image: UIImage)
}

class CSImagePicker: UIViewController {

    unowned(unsafe) var delegate: CSImagePickerDelegate?

}

不出所料,发生了两个错误:

在此输入图像描述

所以我的问题是,为什么苹果公司能做到这一点我不能呢?

顺便说一下,宣布委托的正确方法是什么? 我想我应该用

弱var委托:SomeDelegate?

对?

您看到的UIKit接口不是实际的Swift实现 - 它们只是将ObjC API暴露给Swift并用Swift术语描述它们的行为的声明。

@objc属性向ObjC运行时公开Swift符号。 你没有在这些上看到@objc ,因为它们是 ObjC导入的。

您会看到在ObjC中标记为assign属性上的unowned(unsafe) 顾名思义,这些不安全:ARC不保留对象,并且如果对象消失,它不会确保引用被重置为nil。 其中大多数是早于ARC的代表,无论出于何种原因(二进制兼容性,可能?)从未改变为ARC弱引用。

因此,不要指望该套件能够向您展示您可以模仿的惯用Swift。 你的推论是正确的:在Swift中创建自己的委托属性,声明如下:

weak var delegate: SomeDelegate?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM