Получить сумму значений одной метки из структуры - PullRequest
0 голосов
/ 20 января 2019

Мне нужно добавить не появившееся в массив из этой информации. Если есть дубликат, деньги будут суммированы и затем сохранены в один. Как мне этого добиться? Данных может быть много.

import UIKit

struct TestData {
    let Label : String
    var Money : Double
}

var SaveDate = [TestData]()
var TestD = [TestData]()
SaveDate.append(TestData(Label: "test1", Money: 55))
SaveDate.append(TestData(Label: "test1", Money: 35))
SaveDate.append(TestData(Label: "test2" , Money: 15))
SaveDate.append(TestData(Label: "test1" , Money: 10))
SaveDate.append(TestData(Label: "test3" , Money: 30))
print([{Label "test1", Money 55}, {Label "test1", Money 35}, {Label "test2", Money 15},{Label "test1", Money 10}, {Label "test3", Money 30}])


//Result presentation
//Label1 = test1 , Money = 100
//Label2 = test2 , Money = 15
//Label3 = test3 , Money = 30

Ответы [ 3 ]

0 голосов
/ 20 января 2019

Вы можете использовать словарь для этого.

import UIKit

struct TestData {
    let Label : String
    var Money : Double
}

var SaveDate = [TestData]()
SaveDate.append(TestData(Label: "test1", Money: 55))
SaveDate.append(TestData(Label: "test1", Money: 35))
SaveDate.append(TestData(Label: "test2" , Money: 15))
SaveDate.append(TestData(Label: "test1" , Money: 10))
SaveDate.append(TestData(Label: "test3" , Money: 30))

var dictionaryOfValues:[String:Double] = [:]

func addUp() {
    for currentItem in SaveDate {
        dictionaryOfValues[currentItem.Label] = (dictionaryOfValues[currentItem.Label] == nil ? currentItem.Money : dictionaryOfValues[currentItem.Label] + currentItem.Money)
    }
}

addUp()
print(dictionaryOfValues) //["test1": 100.0, "test2": 15.0, "test3": 30.0]

Я управлял этим на быстрой площадке.

Словарь может отслеживать, когда вы столкнулись с ярлыком или нет. Причина, по которой я делаю dictionaryOfValues[currentItem.Label] = (dictionaryOfValues[currentItem.Label] == nil ? currentItem.Money : dictionaryOfValues[currentItem.Label] + currentItem.Money), заключается в том, что ему нужно либо 1) добавить его в словарь, либо 2) добавить текущее значение к значению, уже существующему в словаре.

Всякий раз, когда вы будете готовы, вы можете позвонить addUp(), и он сделает всю работу за вас.

0 голосов
/ 20 января 2019

Это так просто.

let dict = SaveDate.reduce(into: [String: Double]()) { (result, data) in
    result[data.Label, default: 0] += data.Money
}

Или, точнее,

let dict = SaveDate.reduce(into: [String: Double]()) { $0[$1.Label, default: 0] += $1.Money }

ДИКТ

// ["test2": 15.0, "test3": 30.0, "test1": 100.0]


Примечание: Вы должны использовать lowerCamelCase для имен переменных согласно Рекомендации Swift API .

0 голосов
/ 20 января 2019

Это может помочь:

import UIKit

struct TestData {
    let label : String
    var money : Double
}

var saveData = [TestData]()
saveData.append(TestData(label: "test1", money: 55))
saveData.append(TestData(label: "test1", money: 35))
saveData.append(TestData(label: "test2" , money: 15))
saveData.append(TestData(label: "test1" , money: 10))
saveData.append(TestData(label: "test3" , money: 30))

let testData = saveData.reduce([TestData](), { currentData, newElement in
    var newDataArray = currentData // Swift doesn't allow modifying parameter
    if newDataArray.count == 0 {
        newDataArray.append(newElement)
    } else {
        if let sameLabelIndex = newDataArray.firstIndex(where: { $0.label == newElement.label }) {
            newDataArray[sameLabelIndex].money += newElement.money
        } else {
            newDataArray.append(newElement)
        }
    }
    return newDataArray
})

print(testData)

Документация Apple по reduce: https://developer.apple.com/documentation/swift/array/2298686-reduce

...