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

ee7vknir  于 2022-12-20  发布在  iOS
关注(0)|答案(2)|浏览(221)

发现Swift中有一个关于@的有趣问题,我在封装的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报告了一条错误消息:存储的属性不能用“@ 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
        }
    }
}

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

6yt4nkrj

6yt4nkrj1#

当你看到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
        }
    }
    // ...
}

谢谢你发布这篇文章!你的问题对标题中的错误是一个有帮助的解决方案。

j2datikz

j2datikz2#

在将我的xcode更新为14后,我得到了这个错误,我通过添加平台iOS版本修复了它:

  • 打开文件夹ios
  • 打开Podfile
  • 在Podfile中,取消第2行注解并更改“platform:ios,'14.0'"

相关问题