@available 修饰类成员变量报错Stored properties cannot be marked potentially unavailable

1_uVjgWcISNzIVae_PVRac3A.png

发现 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。

参考:

Swift API Availability

Stackoverfolw

Swift 2 and @available properties

你可能感兴趣的:(@available 修饰类成员变量报错Stored properties cannot be marked potentially unavailable)