美文网首页
@available 修饰类成员变量报错Stored prope

@available 修饰类成员变量报错Stored prope

作者: JerseyBro | 来源:发表于2020-11-12 11:43 被阅读0次
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 prope

    发现 Swift 一个关于 @available 有趣的问题, 我在自己封装的 TableView 里面添加一个系...

  • Java基础-static关键字和单例模式

    static关键字 static关键字的特点用来修饰类的成员-修饰成员变量的称之为类变量(静态变量),修饰成员方法...

  • java se final关键字

    final代表最终,不可改变,可修饰类、成员方法、成员变量、局部变量 一、final的修饰 1、final修饰类 ...

  • static关键字

    static修饰的成员变量: 用static修饰的成员变量,这个成员变量会【早于】类对象的创建而创建,而且【晚于】...

  • Java之final

    final可以修饰变量、方法、类。 final修饰变量 final修饰成员属性(变量)必须初始化; 修饰局部变量使...

  • final关键字

    final:可以修饰 类,方法,局部变量,成员变量 final修饰类:不能有子类 final修饰方法:不能被重写 ...

  • 牛客第四天

    Static修饰成员变量和成员方法,也可修饰静态代码块,不可以修饰类及类成员。 Statement在JDBC中相当...

  • Java中的static使用

    一、static修饰的成员变量 Java 中被 static 修饰的成员称为静态成员或类成员。它属于整个类所有,而...

  • 关于JAVA中的static变量/方法/代码块

    静态变量   在类成员变量中可以分为静态变量(也叫类变量, 有static修饰)和实例变量(没有static修饰)...

  • final关键字

    final关键字的作用: 修饰类,类不能被继承 修饰成员方法,方法不能被重载(override) 修饰成员变量,变...

网友评论

      本文标题:@available 修饰类成员变量报错Stored prope

      本文链接:https://www.haomeiwen.com/subject/ucaubktx.html