Объединение 3 массивов в одну настраиваемую строку текста - PullRequest
1 голос
/ 07 августа 2020

Я создаю приложение для выпечки и застрял на простой задаче ... Но не могу понять, как ее решить.

У меня в основном 3 массива:

let quantity = [200, 300, 400]
let value = ["g", "g", "kg"]
let ingredient = ["Flour", "Butter", "Chocolate"]

Я хочу отобразить эти 3 массива в виде такого текста:

200 g Flour - 300 g Butter - 400 kg Chocolate

Я пробовал следующее:

let arrays = [value, ingredient]
let merge = (0..<arrays.map{$0.count}.max()!).flatMap{i in arrays.filter{i<$0.count}.map{$0[i]}}
let text = merge.joined(separator: " - ")

, что приводит к:

g - Flour - g - Butter - kg - Chocolate 
 

Кто-нибудь знает, как этого добиться? Наверное, это очень просто, но я этого не вижу ...

Ответы [ 3 ]

2 голосов
/ 07 августа 2020

Я бы рекомендовал создать структуру верхнего уровня для хранения всех этих элементов. Работать с массивами и их индексами рискованно и не очень чисто . При вашем текущем подходе вы должны поддерживать 3 отдельных массива - что, если вы забудете добавить элемент к одному из них?

Вместо этого вы можете попробовать следующее:

struct Ingredient: CustomStringConvertible {
    let name: String
    let quantity: Int // may be Double as well
    let unit: Unit
    
    var description: String {
        "\(quantity) \(unit.rawValue) \(name)"
    }
}

enum Unit: String {
    case gram = "g"
    case kilogram = "kg"
}

let ingredients = [
    Ingredient(name: "Flour", quantity: 200, unit: .gram),
    Ingredient(name: "Butter", quantity: 300, unit: .gram),
    Ingredient(name: "Chocolate", quantity: 400, unit: .kilogram)
]

let description = ingredients.map(String.init).joined(separator: " - ")
print(description) 
// prints "200 g Flour - 300 g Butter - 400 kg Chocolate"
0 голосов
/ 07 августа 2020

Если у вас есть для обработки 3 массивов таким образом, было бы неплохо использовать вложенный Zip2Sequence, потому что это будет безопаснее при работе с массивами разной длины. В идеале вы ожидаете, что все массивы будут иметь одинаковую длину, но что, если ... а что, если это не так.

let quantity = [200, 300, 400]
let value = ["g", "g", "kg"]
let ingredient = ["Flour", "Butter", "Chocolate"]

let zippedQuantity = zip(quantity, value)
let result = zip(zippedQuantity, ingredient).map { (quantityZip, ingredient) in
    "\(quantityZip.0) \(quantityZip.1) \(ingredient)"
}

let string = result.joined(separator: " - ")
print(string)

К сожалению, нет Zip3Sequence, чтобы сделать это еще быстрее

0 голосов
/ 07 августа 2020

Вы можете сделать что-то вроде следующего:

let quantity = [200, 300, 400]
let value = ["g", "g", "kg"]
let ingredient = ["Flour", "Butter", "Chocolate"]

var str = ""
for index in quantity.indices {
    str += "\(quantity[index]) \(value[index]) \(ingredient[index]) - "
}

let result = str.dropLast(3)
print(result)

Результат: 200 g Flour - 300 g Butter - 400 kg Chocolate

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...