ios - 无法使用 '@available' 将存储的属性标记为可能不可用

标签 ios swift iphone xcode

我在 Swift 中发现了一个关于 @available 的有趣问题。我在封装的TableView中添加了支持iOS 11及以上版本的var“UISwipeActionsConfiguration”,以支持列表单元格的左滑编辑删除功能。
尝试模仿UITableView的写法来装饰Var,但是IDE直接编译报错。我只能尝试另一种 set get 方法来装饰。我不禁怀疑 Apple 的开源 Swift 源代码是如何隐藏的。编译。
以下是苹果示例代码:

@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的。

最佳答案

当您查看 UITableView 时,您会看到什么不是它如何工作的实际源代码,而是一个显示它的面向用户的实现的头文件。完全有可能这实际上是源代码的样子:

@available(iOS 2.0, *)
open class UITableView : UIScrollView, NSCoding, UIDataSourceTranslating {
    private var _prefetchDataSource: Any? = nil
    @available(iOS 10.0, *)
    weak open var prefetchDataSource: UITableViewDataSourcePrefetching? {
        get {
            return _prefetchDataSource as? UITableViewDataSourcePrefetching
        } set {
            _prefetchDataSource = newValue
        }
    }
    // ...
}
附言感谢您发布此信息!您的问题是对标题错误的有用解决方案。

关于ios - 无法使用 '@available' 将存储的属性标记为可能不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64797366/

相关文章:

ios - Swift 在协议(protocol)中声明类函数

ios - 解析: Expiry time on Array Value

ios - itunes 商店操作失败错误说明不可用

ios - 像 "2016-06-06"这样的字符串到 Swift 3 中的 Date 对象

objective-c - 使用 gdata xml 解析带有命名空间的 xml

swift - 快速隐藏 UIBUTTON

ios - 如何使用 SwiftUI 列表中的自定义 View 平滑扩展行单元格?

iphone - 打开 facebook 对话框进行身份验证而不是在 iphone 中安装 facebook 应用程序?

ios - 如何将物理主体作为子级添加到 SKSpriteNode?

ios - 从设备中删除应用程序时删除与应用程序相关的下载