«Инициализатор для условного связывания должен иметь необязательный тип, а не« [Любой] »- Swift - PullRequest
0 голосов
/ 28 мая 2018

Я изучаю Swift, и в настоящее время я создаю небольшое приложение, которое сохраняет массив значений типа double в NsUserDefaults, а затем извлекает значения.Затем я хотел бы выполнить некоторые математические операции с данными и вывести результат в виде строки, однако ограничения типа означают, что я не могу этого сделать.

В настоящее время мой код выглядит следующим образом:

 // SAVE DOUBLES TO NSUSERDEFAULTS
 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)

  // LOADING VALUES
  let distTime = defaults.array(forKey: distTimeKey) ?? [Double]()
  guard let array = distTime, let pace = Optional.some.(array[2]) else{
    return 
 }

 let stringOP=String(pace)

Ошибки: Однако возвращаются две ошибки

enter image description here Любая помощь, которую вы можете предоставить, будетс благодарностью

1 Ответ

0 голосов
/ 28 мая 2018

Привет, Джордж, то, что ты делаешь неправильно, неправильно использует охранное заявление.Охранный оператор используется для развертывания значения необязательного объекта.

Теперь давайте проанализируем ваш код.Необязательным является то, что вы получаете массив значений, сохраненный в 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.В документации есть отличные примеры, которые могут помочь вам улучшить ваш код.

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