ios - Swift 中的泛型选择器视图
问题描述
我正在尝试使用泛型创建一个通用的 UI 选择器。作为实现的一部分,我创建了要在 UIPicker 中显示的 GenericRow 对象。但我面临一些问题。它可能是基本的,但无法找到。
struct GenericRow<T> {
let type: T
let title: String
public init(type: T, title: String) {
self.type = type
self.title = title
}
}
接下来是处理 UIPickerViewDataSource 和 UIPickerViewDelegate 的 GenericDataSource。
class GenericPickerDataSource<T>: NSObject, UIPickerViewDelegate, UIPickerViewDataSource {
public var items: [GenericRow<T>]
public init(withItems items: [GenericRow<T>]) {
self.items = items
}
public func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return items.count
}
public func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return items[row].title
}
}
然后,我正在创建一个管理器来处理选择器显示/隐藏功能。请注意,这也是通用的,对 GenericRow 类型一无所知。
class GenericPickerManager {
static func showPicker(_ dataSource: GenericPickerDataSource<Any>) {}
static func hidePicker() {}
}
示例输入:
struct State {
let identifier: String
let name: String
}
let CA = State(identifier: "CA", name: "California")
let CLT = State(identifier: "CLT", name: "Charlotte")
let IL = State(identifier: "IL", name: "Illinois")
let states = [CA, CLT, IL]
let items = states.map {
GenericRow<State>(type: $0, title: $0.name)
}
let dataSource = GenericPickerDataSource(withItems: items)
现在,当我尝试从课堂上显示选择器时,出现错误。
GenericPickerManager.showPicker(dataSource)
无法将 GenericPickerDataSource<State> 类型的值转换为预期的参数类型 GenericPickerDataSource<Any>。
如何解决这个问题?
解决方案
Any
和泛型不能很好地协同工作。GenericPickerManager
也通用:
class GenericPickerManager<T> {
static func showPicker(_ dataSource: GenericPickerDataSource<T>) {}
static func hidePicker() {}
}
推荐阅读
- php - Paypal ipn在上个月返回403,带有php代码
- rabbitmq - 请求因超时而失败,为什么?
- google-signin - 用于网站的 Google 登录:无需登录 Chrome 即可进行身份验证
- axapta - 'PurchPurchaseOrderLineEntity' 类型的表行的写入验证失败
- javascript - 通过对应于另一个数组中的数字的索引替换数组中的元素
- react-native - 反应原生延迟状态为什么需要 700ms-1sec?
- python - 为什么我有不同的编码器产生相同的结果?
- vb.net - 编译代码而不显示控制台窗口
- javascript - 如何禁用按下材质ui滑块的拇指的光环效果?
- sublimetext3 - sublinetext 上的橙色线如何修复