我不确定如何在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?
}
Run Code Online (Sandbox Code Playgroud)
不出所料,发生了两个错误:
所以我的问题是,为什么Apple可以做到这一点我不能?
顺便说一下,宣布委托的正确方法是什么?我想我应该用
弱var委托:SomeDelegate?
对?
ric*_*ter 10
您看到的UIKit接口不是实际的Swift实现 - 它们只是将ObjC API暴露给Swift并用Swift术语描述它们的行为的声明.
该@objc属性将Swift符号公开给ObjC运行时.您没有看到@objc这些,因为它们是从 ObjC 导入的.
您可以在ObjC unowned(unsafe)中标记的属性上看到assign.顾名思义,这些不安全:ARC不保留对象,并且如果对象消失,它不会确保引用被重置为nil.其中大多数是早于ARC的代表,无论出于何种原因(二进制兼容性,可能?)从未改变为ARC弱引用.
因此,不要指望该套件能够向您展示您可以模仿的惯用Swift.你的推论是正确的:在Swift中创建自己的委托属性,声明如下:
weak var delegate: SomeDelegate?
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
591 次 |
| 最近记录: |