Модификация массива в цикле - PullRequest
0 голосов
/ 27 января 2019

Я работаю над приложением командной строки. Первый массив (который называется firstArray, yes) является результатом пользовательского ввода через readLine (), все его элементы - Double. Теперь мне нужно создать второй массив с результатами вычислений, примененными к моему первому массиву. Некоторым из результатов является NaN, причина тригонометрических расчетов. Мне нужно изменить все NaN на строку, но я получаю ошибку «Невозможно присвоить значение типа« String »типу« Double »». Как решить эту проблему?

func calcLn () -> [Double] {

var calculatedArray = [Double]()

for item in firstArray {
    var result = log(Double((-100))/(cos(item)))
    calculatedArray.append(result)
}

for index in 0..<calculatedArray.count {
    if calculatedArray[index].isNaN {
    calculatedArray[index] = String("can't calculate")

1 Ответ

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

Массив может хранить только один тип вещей. calculatedArray может хранить только Double с, поэтому вы не можете установить его элементы на String с.

Вы можете создать новый массив с именем outputArray, в котором можно хранить строки и преобразовать все двойные числа в строки:

var outputArray = [String]()
for index in 0..<calculatedArray.count {
    if calculatedArray[index].isNaN {
        outputArray.append("can't calculate")
    } else {
        outputArray.append("\(calculatedArray[index])")
    }
}

Ваш метод calcLn возвращает [Double], но похоже, что вы хотите вернуть outputArray. Если это так, вам нужно изменить его подпись, чтобы она возвращала [String].

Обратите внимание, что вы можете выполнять преобразования массива с помощью map. Вот более короткая версия вашего кода:

func calcLn () -> [String] {
    let calculatedArray = firstArray.map { log(100.0/cos($0)) }
    let outputStringsArray = calculatedArray.map { $0.isNaN ? "can't calculate" : "\($0)" }

    return outputStringsArray
}
...