如何使用通用参数类型创建

时间:2018-12-28 06:58:34

标签: swift generics eureka-forms

我具有用于创建具有不同类型的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
          })
     }
}

1 个答案:

答案 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结构与EquatableCustomStringConvertible保持一致。

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
    }
}