Привет, Джордж, то, что ты делаешь неправильно, неправильно использует охранное заявление.Охранный оператор используется для развертывания значения необязательного объекта.
Теперь давайте проанализируем ваш код.Необязательным является то, что вы получаете массив значений, сохраненный в UserDefaults
, и он имеет значение [Any]?
.Теперь, чтобы сделать еще один шаг вперед, вы знаете, что вы сохранили свои значения в виде массива двойных чисел, поэтому вам нужно будет преобразовать [Any]?
в [Double]
.Итак, давайте сделаем это точно.Итак, вот код конца, если бы вы все исправили.
let defaults = UserDefaults.standard
let distanceElapsed = 0.0
let counter = 3.0
let paceVal = 5.4
let genericValues = [Double(distanceElapsed), Double(counter), Double(paceVal)]
defaults.set(genericValues, forKey: distTimeKey)
guard let distTime = defaults.array(forKey: distTimeKey) as? [Double] else {
// Do something if there are no values or if the values in the array were not of type Array of double in distTime
fatalError("Something wrong")
}
if distTime.count > 2 {
let pace = distTime[2]
let paceAsString = String(pace)
print(paceAsString)
}
Итак, чтобы объяснить код, как вы можете видеть, мы используем as?
для необязательного приведения к [Double]
и guard else
означает, что если это значение не приведено к [Double]
, выполнить блок else, если оно продолжит выполнение.В этом случае я просто бросил fatalError
, но вы могли просто return
из казни.
Тогда ваша вторая проблема в том, что вы пытаетесь получить значение во втором индексе массива;однако вы знаете, что если во втором индексе нет значения, вы пытаетесь получить доступ к значению, которое не существует.Вот для чего distTime.count > 2
.
Надеюсь, это прояснит ситуацию лучше.Я очень рекомендую ознакомиться с основами языка Swift.В документации есть отличные примеры, которые могут помочь вам улучшить ваш код.