【发布时间】:2021-02-24 01:42:54
【问题描述】:
我在 Swift 中发现了一个关于 @available 的有趣问题。我在我封装的TableView中添加了一个支持iOS 11及以上的var“UISwipeActionsConfiguration”,以支持列表单元格的左滑编辑和删除功能。 我尝试模仿UITableView的写法来装饰Var,但是IDE直接编译报错。我只能尝试另一种set get方法来装饰。我不禁怀疑苹果的开源 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 marking possible available 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
}
}
}
最终代码可以正常运行,但是我很想知道苹果开源的UITableView在Swift背后是如何实现使用@available(iOS 11.0, *)修改Var的。
【问题讨论】: