две почти одинаковые функции в одну? - PullRequest
0 голосов
/ 04 мая 2020

У меня две функции. Они делают то же самое на самом деле. Получение данных из результатов базы данных с помощью fieldNameArray в массив Int или Double. Как я могу объединить эти две функции в одну? это возможно ? Единственное отличие - это тип поля и, следовательно, тип возвращаемого значения.

func fieldsToInt ( fieldNameArray : [String] ) -> [Int] {
   var returnArray = [Int]()
   for fNA in fieldNameArray {
      let n = Int ( results.int(forColumn: fNA) )
      returnArray.append( n )
    }
   return returnArray;
}

func fieldsToDouble ( fieldNameArray : [String] ) -> [Double] {
   var returnArray = [Double]()
   for fNA in fieldNameArray {
   let n = Double ( results.int(forColumn: fNA) )
      returnArray.append( n )
   }
   return returnArray;
}

Ответы [ 2 ]

3 голосов
/ 04 мая 2020

Да, возможно, вам следует использовать Generics , в частности вам нужна универсальная c функция.

Код, который решает вашу проблему, будет выглядеть примерно так:

// This is a struct to mock the code you didn't post
struct Results {

    func int(forColumn: String) -> Int16 {
        return 1
    }
}

let results = Results()

protocol DatabaseElementRepresentable {

    init?(_ databaseValue: Int16)
}

func fields<Element: DatabaseElementRepresentable>(fieldNameArray : [String]) -> [Element] {
    var returnArray = [Element]()
    for fNA in fieldNameArray {
        if let n = Element(results.int(forColumn: fNA)) {
            returnArray.append(n)
        }
    }
    return returnArray
}

extension Int: DatabaseElementRepresentable { }
extension Double: DatabaseElementRepresentable { }

let ints: [Int] = fields(fieldNameArray: ["test"])
let doubles: [Double] = fields(fieldNameArray: ["test"])

Пожалуйста, измените Int16 на значение, которое функция int(forColumn: возвращает

3 голосов
/ 04 мая 2020

Вы можете попробовать дженерики, как

func fieldsToNumber<T> ( fieldNameArray : [String] ) -> [T] {
   var returnArray = [T]()
   for fNA in fieldNameArray {
   let n = T ( results.int(forColumn: fNA) )
      returnArray.append( n )
   }
   return returnArray;
}
...