Как я могу собрать значения массива в виде числа? - PullRequest
0 голосов
/ 02 июня 2019

Я хочу, чтобы из табличного представления собиралось значение MyArray как

Swift:

let total = UILabel()

var MyArray = ["2", "9", "33", "4"]

total.text = ?? // i want result be like this [2+9+33+4] = 48

, и если добавить какое-либо значение или удалить какое-либо изменение результата, то

я надеюсь, что япоставил правильный вопрос и надеюсь получить правильный ответ

Ответы [ 4 ]

2 голосов
/ 02 июня 2019

Преобразовать тип элементов myArray из String в Double, используя compactMap.Затем добавьте элементы, используя метод reduce.Затем преобразуйте результат в строку для отображения в метке.

var myArray = ["2", "9", "33", "4", "wot?", "?"]
total.text = String(myArray.lazy.compactMap{ Double($0) }.reduce(0, +))//48.0
2 голосов
/ 02 июня 2019

Выполните итерацию по вашему массиву, используя условное связывание, если значение недопустимо, например, "привет", оно не войдет в условие.

var result = 0

for element in MyArray { // MyArray should have the first letter lowercased and have a more meaningful name.
    if let number = Int(element) { // or NSNumber, Double, etc...
        result = result + number
    }
}

total.text = "\(result)" // consider naming it totalLabel
1 голос
/ 03 июня 2019

Есть два шага: *

  1. Рассчитать сумму.

    Рассмотрим:

    let array = ["200", "900", "33", "4"]
    
    let total = array
        .lazy
        .compactMap { Double($0) }
        .reduce(0, +)
    

    Примечание,в отличие от других предложений, я воздерживаюсь от размещения этого в одной строке кода (хотя можно).Цель шаблонов функционального программирования - написать выразительный, но эффективный код, который легко рассуждать.Помещение всего этого в одну строку противоречит этой цели, ИМХО, хотя, возможно, это вопрос личных предпочтений.

  2. Задание текста метки.

    При настройке текста метки очень заманчиво захотеть просто сделать String(total).Но это не очень удобная для пользователя презентация (например, сумма 1137 будет показана как «1137.0»).Он также не локализован.

    Типичным решением при отображении результата (будь то числа, даты, интервалы времени и т. Д.) В пользовательском интерфейсе является использование «форматера».В случае числовых значений обычно используется NumberFormatter:

    let formatter = NumberFormatter()
    formatter.numberStyle = .decimal
    label.text = formatter.string(for: total)
    

    Для пользователя в США, который будет показывать «1137», тогда как для немецкого пользователя будет «1.137».Таким образом, каждое устройство видит число, представленное в формате, соответствующем предпочтениям пользователей по локализации.

1 голос
/ 02 июня 2019

Два предложения:

  1. С reduce для суммирования значений и игнорирования нецелых значений

    total.text = String(myArray.reduce(0, {$0 + (Int($1) ?? 0)}))
    
  2. С NSExpression если массив содержит только строковые представления целых чисел.joined преобразует массив в "2+9+33+4"

    let additionExpression = NSExpression(format: myArray.joined(separator: "+"))
    total.text = "\(additionExpression.expressionValue(with: nil, context: nil)!)"
    
...