发现Swift中有一个关于@的有趣问题,我在封装的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报告了一条错误消息:存储的属性不能用“@ 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
}
}
}
最后的代码可以正常运行,但我很想知道Swift背后的苹果开源UITableView是如何实现使用@available(iOS 11.0,*)修改Var的。
2条答案
按热度按时间6yt4nkrj1#
当你看到
UITableView
的时候,你看到的并不是它工作原理的源代码,而是一个头文件,显示了它面向用户的实现,完全有可能这就是源代码的样子:谢谢你发布这篇文章!你的问题对标题中的错误是一个有帮助的解决方案。
j2datikz2#
在将我的xcode更新为14后,我得到了这个错误,我通过添加平台iOS版本修复了它: