簡體   English   中英

如何使用通用參數類型創建PushRow函數

[英]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結構符合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
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM