【问题标题】:Unwrapping String from NSUserDefaults list从 NSUserDefaults 列表中解包字符串
【发布时间】:2016-06-09 11:37:32
【问题描述】:

我对 swift 和展开概念非常陌生。我正在尝试将字符串数组存储到 NSUserDefaults 中。将结果打印到控制台后,数组显示为

[Optional("VarOne"), Optional("VarTwo")] //the two test variables stored in the array

目标是实现:

["VarOne", "VarTwo"]

我做了很多测试来获得类似的解决方案。我的代码如下:

    let defaults = NSUserDefaults.standardUserDefaults()

    if let array = defaults.arrayForKey("listOfPlayers"){

        for i in array{
        print(i)
        }

    }

我的主要问题是如何在这种情况下解开变量。澄清一下,这些是字符串变量。

编辑:我在将数组添加到 NSUserDefaults 的位置包含了我的代码

let userDefaults = NSUserDefaults.standardUserDefaults()
        userDefaults.setObject(listOfPlayers, forKey: "listOfPlayers")
        userDefaults.synchronize()

【问题讨论】:

  • 您所拥有的没有任何问题,您打印的描述只是为您提供了比您预期更多的信息
  • 所以,问题是当我尝试直观地显示它时,它也显示为可选。这显然是应用程序清晰度的一个主要问题。
  • 您可能已经使用字符串插值将字符串保存在数组中,它添加了文字Optional。考虑尽可能使用非可选字符串。
  • 不要使用字符串的描述,或者除了记录目的之外的任何东西......问题实际上是你如何首先将字符串添加到数组中
  • 对不起,我不明白,我如何使用字符串的描述?

标签: arrays swift nsuserdefaults


【解决方案1】:

试试这个:

   let defaults = NSUserDefaults.standardUserDefaults()

if let array = defaults.arrayForKey("listOfPlayers"){

    for i in array{
      let io = i as! AnyObject
    print(io)
    }

}

【讨论】:

    【解决方案2】:

    尝试以下方法:

    if NSUserDefaults.standardUserDefaults().objectForKey("listOfPlayers") != nil
    {
        let array = NSUserDefaults.standardUserDefaults().objectForKey("listOfPlayers") as! [String]
    
        for i in array
        {
           print(i)
        }
    }
    

    你可以一次性解开整个数组,但你不能在检查数组是否存在于 NSUserDefaults 中的条件下这样做。

    【讨论】:

    • 它应该...刚刚测试过。您是否复制了所有代码,包括第三行中的“as![String]”部分?
    • 你不应该使用强制类型转换,因为你试图使用 as! 将数组从用户默认值转换为字符串数组! .因为,如果数组不包含字符串类型的值,你会得到一个异常。
    【解决方案3】:

    你可以使用!或者 ?运营商。

    let defaults = NSUserDefaults.standardUserDefaults()
    
        if let array = defaults.arrayForKey("listOfPlayers"){
    
            for i in array {
              if let value = i as? String {
                 print(value)
              }
            }
        }
    

    【讨论】:

    • 这些实际上是字符串变量,当我尝试时?字符串发生错误:类型字符串?不符合协议“SequenceType”
    • 确定是?字符串在“i”而不是“array”变量上。
    【解决方案4】:

    首先,arrayForKey 将返回一个 AnyObject 类型的可选数组,即 [AnyObject]?在您的场景中,该数组包含可选字符串。

    if let optionalStringArray = NSUserDefaults.standardUserDefaults().arrayForKey("listOfPlayers") {
    // Now you'll be having an array of AnyObject, in your case you have array of optional string
    for optionalString in optionalStringArray {
      if let str = optionalString as? String {
      print(str) // You got your string value here
      }
    }
    

    HTH :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-10
      • 1970-01-01
      • 1970-01-01
      • 2020-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多