"条件绑定的初始化程序必须具有可选类型,而不是' [任何]'" - 斯威夫特

时间:2018-05-28 10:35:52

标签: arrays swift types double optional

我正在学习Swift,我目前正在构建一个小应用程序,它将一组双打存储到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 :(得分:0)

嘿,乔治,你做错了的事情就是把守卫声明错了。 guard语句用于解包可选Object的值。

现在让我们分析您的代码。可选的是当您获得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表示此值不会转换为{{ 1}}执行else块,如果它继续执行。在这种情况下,我只是扔了一个[Double],但你可以从执行中简单地fatalError

然后你的第二个问题是你试图在数组的第二个索引处获取值;但是,您知道如果第二个索引中没有值,您将尝试访问不存在的值。这就是return的用途。

我希望这能更好地澄清事情。我强烈建议您阅读Swift语言的基础知识。文档中有很多可以帮助您改进代码的例子。