gpt4 book ai didi

ios - 使用扩展在没有函数声明的情况下向现有协议(protocol)添加函数

转载 作者:行者123 更新时间:2023-11-28 10:07:41 26 4
gpt4 key购买 nike

我正在尝试制作 UITableView通知其代表 contentSize什么时候contentSizeUITableView已更新。

所以我将属性观察器添加到 contentSizeUITableview调用名为 tableView(_ tableView: didUpdateContentSize contentSize:) 的委托(delegate)方法.

然后我扩展了UITableViewDelegate这样UIViewController符合 UITableViewDelegate可以申报tableView(_ tableView: didUpdateContentSize contentSize:)用于其用例。

extension UITableView {
override open var contentSize: CGSize {
didSet {
self.delegate?.tableView(self, didUpdateContentSize: contentSize)
}
}
}

extension UITableViewDelegate {
func tableView(_ tableView: UITableView, didUpdateContentSize contentSize: CGSize)
// Error: "Expected '{' in body of function declaration"
}

但是在UITableViewDelegate的扩展代码中,它得到一个错误“函数声明体中预期的'{'”

没有函数声明就无法扩展现有协议(protocol)(如 UIKit 委托(delegate)协议(protocol))吗?

我想在不创建 UITableView 的子类的情况下实现我的意图.

最佳答案

这部分已经无效了:

extension UITableView {
override open var contentSize: CGSize {
didSet {
self.delegate?.tableView(self, didUpdateContentSize: contentSize)
}
}
}

不允许覆盖扩展中的方法/属性。有时你可能会逃避它,但它是未定义的行为(我很惊讶 Swift 编译器没有抛出错误)。不保证会实际调用此实现。有可能;可能不是;有时可能是。参见 Overriding methods in Swift extensions有关更多详细信息。 (这是一个 NSObject 子类的事实可能是它没有失败的原因,但这并不能使它正常。这在 ObjC 中也不安全。)

实现这个的正确方法是让委托(delegate)使用 NSKeyValueObserving观察 tableView 的 contentView

关于ios - 使用扩展在没有函数声明的情况下向现有协议(protocol)添加函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51595354/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com