ios - Swift 中的泛型选择器 View

标签 ios swift generics

我正在尝试使用泛型创建一个通用的 UI 选择器。作为实现的一部分,我创建了要在 UIPicker 中显示的 GenericRow 对象。但我面临一些问题。这可能是基本的,但找不到。

struct GenericRow<T> {
    let type: T
    let title: String
    public init(type: T, title: String) {
        self.type = type
        self.title = title
    }
 }

接下来是 GenericDataSource 来处理 UIPickerViewDataSource 和 UIPickerViewDelegate。

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)

现在,当我尝试显示类(class)中的选择器时,出现错误。

GenericPickerManager.showPicker(dataSource)

Cannot convert value of type GenericPickerDataSource<State> to expected argument type GenericPickerDataSource<Any>.

如何解决这个问题?

最佳答案

Any 和泛型不能很好地协同工作。使 GenericPickerManager 也通用:

class GenericPickerManager<T> {
    static func showPicker(_ dataSource: GenericPickerDataSource<T>) {}

    static func hidePicker() {}
}

关于ios - Swift 中的泛型选择器 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54054874/

相关文章:

ios - 在tableview中插入和删除单元格,将文本字段放入单元格中,然后将文本字段数据放入swift中的json原始参数中

iOS 火力地堡 : Add data to firebase node of array type

ios - 在不重新启动应用程序的情况下更改 Realm 文件

swift - Swift 3 中通用协议(protocol)类型的变量

c# - MVC View 脚手架不适用于通用基类?

ios - 使用 Braintree 进行 iOS 订阅

ios - 如何设置 TouchableWithoutFeedback 的宽度取决于 react-native 中的文本?

ios - 喜欢按钮状态未保存

ios - 如何检测 Mapbox map 中缩放级别的变化?

c# - 连接列表项属性