存储的属性不能用“@available”标记为可能不可用

Jer*_*sey 13 iphone xcode ios swift

我在 Swift 中发现了一个关于 @available 的有趣问题。我在我封装的TableView中添加了一个支持iOS 11及以上版本的var“UISwipeActionsConfiguration”,以支持列表单元格的左滑编辑和删除功能。我尝试模仿UITableView的写法来装饰Var,但是IDE直接编译报错。我只能尝试另一个set get方法来装饰。我不禁怀疑苹果开源的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?
}
Run Code Online (Sandbox Code Playgroud)

下面是我的示例代码:

@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? 
}
Run Code Online (Sandbox Code Playgroud)

我的代码没有正常编译,IDE报错信息:Stored Properties不能用'@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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

最终代码可以正常运行,但是我很想知道Swift背后苹果开源的UITableView是如何实现使用@available(iOS 11.0, *)来修改Var的。

Use*_*ser 10

当您查看时,您看到的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
        }
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

PS感谢您发布此内容!您的问题是对标题错误的有用解决方案。