【问题标题】:"Initializer for conditional binding must have Optional type, not '[Any]'" - Swift“条件绑定的初始化程序必须具有可选类型,而不是'[Any]'” - Swift
【发布时间】:2018-11-06 22:23:00
【问题描述】:

我正在学习 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)

错误: 但是,这会返回两个错误

您能提供的任何帮助将不胜感激

【问题讨论】:

  • 为什么您认为将() 添加到distTime 是合适的?
  • 请添加 distTime() 函数定义也有问题。
  • distTime() 在里面写什么
  • 道歉@Sweeper 等。人。 .这是一个疏忽,我现在已经纠正了这个,但是,错误仍然存​​在。我没有相应地更新我的帖子。
  • @George 你在哪里写这段代码。你能显示周围函数的签名吗?

标签: arrays swift types double optional


【解决方案1】:

嘿,乔治,你做错的事情是错误地使用了警卫语句。守卫语句用于解开可选对象的值。

现在让我们分析您的代码。可选的是当您获得保存在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 语言基础知识。文档中有很好的示例可以帮助您改进代码。

【讨论】:

  • 感谢您花时间写这篇文章,这非常有帮助。感谢您帮助我!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 2017-01-22
  • 2018-03-25
  • 2016-01-08
  • 2017-04-08
相关资源
最近更新 更多