gpt4 book ai didi

ios - 数组中的 Swift 通用协议(protocol)类类型

转载 作者:搜寻专家 更新时间:2023-10-31 22:04:05 25 4
gpt4 key购买 nike

我们已经实现了一个协议(protocol),Reusable,以简化我们的 UITableViewCellUITableView 注册/出队实现。

protocol Reusable: class {
static var defaultIdentifier: String { get }
}

extension Reusable where Self: UITableViewCell {
static var defaultIdentifier: String {
return String(describing: self)
}
}

class TestTableViewCell: UITableViewCell, Reusable { }
class AnotherTestTableViewCell: UITableViewCell, Reusable { }

然后,UITableView 有一个扩展,例如:

extension UITableView {
func register<T: UITableViewCell & Reusable>(_: T.Type) {
register(UINib(nibName: T.defaultIdentifier, bundle: nil), forCellReuseIdentifier: T.defaultIdentifier)
}
}

及其用法:

let tableView: UITableView = UITableView()
tableView.register(TestTableViewCell.self)
tableView.register(AnotherTableViewCell.self)

一切正常,但我们想将这些类型移动到一个数组中,以便排序。这就是我们卡住的地方,这是行不通的:

let viewCells = [TestTableViewCell.self, AnotherTestTableViewCell.self]
// Without type annotation, it's [UITableViewCell.Type]
// And the error is: Instance method 'register' requires that 'UITableViewCell' conform to 'Reusable'

for viewCell in viewCells {
tableView.register(viewCell)
}

我们也尝试过:

let viewCells: [Reusable.Type] = ...
// Error: Cannot invoke 'register' with an argument list of type '(Reusable.Type)'

还有这个:

let viewCells: [(UITableViewCell & Reusable).Type] = ...
// Error: Instance method 'register' requires that 'UITableViewCell' conform to 'Reusable'

有没有一种方法可以将符合协议(protocol)的类类型信息存储在数组中以使其工作?

最佳答案

只需为 UITableViewCell 编写一个扩展,使其符合 Reusable 协议(protocol)并且不要将单元格转换为任何类型:

extension UITableViewCell: Reusable {}


附言您还可以查看 iOS 上最流行的 Reusable 协议(protocol)实现 here .


祝你好运:)

关于ios - 数组中的 Swift 通用协议(protocol)类类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55746581/

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