我正在学习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)
错误: 但是,这会返回两个错误
答案 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语言的基础知识。文档中有很多可以帮助您改进代码的例子。