發(fā)現 Swift 一個關于 @available 有趣的問題, 我在自己封裝的 TableView 里面添加一個系統支持 iOS 11 以上的 var "UISwipeActionsConfiguration" 用于支持列表 Cell 左滑編輯刪除功能.
我試著模仿 UITableView 的寫法來對 Var 進行修飾, 但是 IDE 直接編譯報錯了, 我只能嘗試另一種 set get 的方式來修飾, 讓我不禁對 Apple 開源的 Swift 源碼表示懷疑其是如何隱藏實現通過編譯的.
下面是 Apple 示例代碼:
@available(iOS 2.0, *)
open class UITableView : UIScrollView, NSCoding, UIDataSourceTranslating {
@available(iOS 10.0, *)
weak open var prefetchDataSource: UITableViewDataSourcePrefetching?
@available(iOS 11.0, *)
weak open var dragDelegate: UITableViewDragDelegate?
@available(iOS 11.0, *)
weak open var dropDelegate: UITableViewDropDelegate?
}
下面是我的示例代碼:
@available(iOS 11.0, *)
public protocol HTCTableViewDelegate {
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?
}
@available(iOS 11.0, *)
public typealias EditSwipeActionsCellCallback = (_ viewModel: Any, _ sectionModel: HTCTableViewSection) -> UISwipeActionsConfiguration?
public class JSDTableView : UITableView, UITableViewDataSource, UITableViewDelegate {
@available(iOS 11.0, *)
public var editSwipeActionsCallback: EditSwipeActionsCellCallback?
@available(iOS 11.0, *)
weak open var jsdDelegate: HTCTableViewDelegate?
}
我的代碼沒有正常通過編譯, IDE 報錯提示: Stored properties cannot be marked potentially unavailable with '@available'
最終我只能通過下面的方式來實現:
@available(iOS 11.0, *)
public typealias EditSwipeActionsCellCallback = (_ viewModel: Any, _ sectionModel: HTCTableViewSection) -> UISwipeActionsConfiguration?
public class HTCTableView : UITableView, UITableViewDataSource, UITableViewDelegate {
private var _editSwipeActionsCallback: Any? = nil
@available(iOS 11.0, *)
var editSwipeActionsCallback: EditSwipeActionsCellCallback? {
get {
return _editSwipeActionsCallback as? EditSwipeActionsCellCallback
}
set {
_editSwipeActionsCallback = newValue
}
}
}
最終的代碼能正常進行功能, 但是我非常想了解 Apple 背后對 Swift 開源的 UITableView 是如何實現對 var 使用 @available(iOS 11.0, *) 修飾 Var蠢箩。
參考: