【问题标题】:Stored properties cannot be marked potentially unavailable with '@available'无法使用“@available”将存储的属性标记为可能不可用
【发布时间】:2021-02-24 01:42:54
【问题描述】:

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

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

【问题讨论】:

    标签: ios swift iphone xcode


    【解决方案1】:

    当您查看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
            }
        }
        // ...
    }
    

    附:谢谢你张贴这个!您的问题对标题错误很有帮助。

    【讨论】:

    • 我非常同意你的解释。让我困惑的是,Swift 并没有自称是完全开源的,源代码也在 github 上。在我看来,是不是只是比Objective-c相对开源,但有些源码还是会区分声明的。实施将被隐藏
    • 这是一个隐藏实现的例子......我们实际上并没有看到它(甚至可能是用Objective-C编写的......)
    猜你喜欢
    • 2022-10-17
    • 2022-12-08
    • 2022-11-13
    • 2022-10-25
    • 2021-10-15
    • 2017-06-13
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多