[英]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.