@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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文: NSRegular​Expression 原作者:Nate Cook 遇到问题,哦,要用NSRegular...
    BoxDeng阅读 1,533评论 0 1
  • 用到的组件 1、通过CocoaPods安装 2、第三方类库安装 3、第三方服务 友盟社会化分享组件 友盟用户反馈 ...
    SunnyLeong阅读 14,660评论 1 180
  • runtime 和 runloop 作为一个程序员进阶是必须的,也是非常重要的, 在面试过程中是经常会被问到的, ...
    SOI阅读 21,848评论 3 63
  • 只是随笔, 若有不知所云处, 敬请忽略. 关于NSInvocation 1. 创建一个MethodSigna...
    丶信步沧桑阅读 1,023评论 0 0
  • Objective-C是基于C语言加入了面向对象特性和消息转发机制的动态语言,这意味着它不仅需要一个编译器,还需要...
    Sam_Lau阅读 24,799评论 29 219