簡體   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