为什么Apple可以在没有@objc的情况下声明可选的协议功能,以及无主的可选变量,但我不能?

时间:2014-10-25 04:07:49

标签: ios swift

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

以下是UITableView委托的声明:

enter image description here

代表是无主(不安全)可选值,但根据Apple's doc

enter image description here

据说

  

假定无主参考始终具有值

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

此外,以下是UITableViewDelegate的声明:

enter image description here

显然有几个可选功能。根据{{​​3}}:

enter image description here

据说

  

如果您的协议标有@objc属性

,则只能指定可选的协议要求

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

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

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

class CSImagePicker: UIViewController {

    unowned(unsafe) var delegate: CSImagePickerDelegate?

}

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

enter image description here

所以我的问题是,为什么Apple可以通过我无法做到这一点?

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

  

弱var委托:SomeDelegate?

右?

1 个答案:

答案 0 :(得分:10)

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

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

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

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

weak var delegate: SomeDelegate?