我具有用于创建具有不同类型的PushRow的不同功能。 它同时包括字符串类型和自定义类型。如何将这些功能合并为一个接受通用参数以创建PushRow的功能
fileprivate func createPushRow1() {
form +++ Section(label)
<<< PushRow<String>(String(typeId)) {
$0.title = label.lowercased()
$0.selectorTitle = "Pick " + label.lowercased()
$0.options = optionList
}.onChange({ [unowned self] row in
row.value = row.value
})
}
fileprivate func createPushRow2() {
self.form +++ Section(label)
<<< PushRow<Priority>(String(typeId)) {
$0.title = label.lowercased()
$0.selectorTitle = "Pick " + label.lowercased()
$0.options = priorityList
$0.displayValueFor = {
guard let priority = $0 else { return nil }
return priority.name
}
$0.onChange({ [] row in
row.value = row.value
})
}
}
答案 0 :(得分:2)
PushRow
选项必须符合Equatable
。因此,假设您的Priority
类符合Equatable
,则可以使用follow函数,该函数将通用的可等于类型作为参数来创建PushRow
。
func createPushRow<T: Equatable>(type: T.Type, options: [T]) {
self.form +++ Section(label)
<<< PushRow<T>(String(typeId)) {
$0.title = label.lowercased()
$0.selectorTitle = "Pick " + label.lowercased()
$0.options = options
}
}
您可以简单地使用这样的功能。
self.createPushRow(type: String.self, options: ["option A", "option B"])
但是,尽管您需要特别注意PushRow标记String(typeId)
,因为Eureka不接受带有相同标记的行,因此您可能希望将唯一的行标记作为通用函数中的另一个参数传递。 / p>
已更新
您可以简单地将Priority
结构与Equatable
和CustomStringConvertible
保持一致。
struct Priority: Equatable, CustomStringConvertible {
let id: Int
let name: String
var description: String {
return self.name
}
static func == (lhs: Priority, rhs: Priority) -> Bool {
return lhs.id == rhs.id
}
}