![](/img/trans.png)
[英]How to use generic type in function parameter from generic class in Swift
[英]How to create PushRow function with generic parameter type
我有不同的功能来创建具有不同类型的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
})
}
}
PushRow
选项要求符合Equatable
。 因此,假设您的Priority
类符合Equatable
,则可以使用follow函数,该函数将通用的equatable类型作为参数来创建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不接受带有相同标记的行,因此您可能希望将唯一的行标记作为通用函数中的另一个参数传递。
更新
您可以简单地使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
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.