Как создать функцию PushRow с универсальным типом параметра - PullRequest
0 голосов
/ 28 декабря 2018

У меня разные функции для создания 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 голосов
/ 28 декабря 2018

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 не принимает строки с одним и тем же тегом, поэтому вам, вероятно, захочется передать уникальный тег строки как другойпараметр в обобщенной функции.

Обновлено

Вы можете просто согласовать свою структуру 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
    }
}
...