为什么我不能打开 UserDefault 类型的字符串? [Swift 3.0 - Xcode 8]

Why cant I unwrap a UserDefault type string? [Swift 3.0 - Xcode 8]

我已将委托发回的数据存储为用户默认值,我正在尝试准备它以在 segue 中发送。我可以在 segue 中发送它,我遇到的问题是数据以 "optional[Data]" 的形式出现我知道可选的意思,但它不允许我像可选的那样解包 UserDefault它说它是可选的?

代码如下:

 func DataToPass(ArrayName: [String]) {
    print("Check ArrayContent--->",ArrayName)
    var DCollect = [String]()
    var CCollect = [String]()
    DCollect.append(ArrayName[0])
    CCollect.append(ArrayName[1])
    let defaults = UserDefaults.standard
    if let unwrap = defaults{
        unwrap.set(DCollect, forKey: "DCollect")
        unwrap.set(CCollect, forKey: "CCollect")
    }
}

错误是:

"Initializer for conditional binding must have Optional type, not 'UserDefaults'" on line if let unwrap = defaults{

为什么我不能这样打开它?

另一次尝试:

    func DataToPass(ArrayName: [String]) {
        print("Check",ArrayName)
        UserDefaults.standard.set(ArrayName, forKey: "ToCollect")
        }


     override func prepare(for segue: UIStoryboardSegue, sender: Any?){
        if segue.identifier == "SegueInfo"{
        let firstController = segue.destination as! ViewController
        if let Tosend = UserDefaults.standard.value(forKey: 
        "ToCollect") as? String {
        Collect.append(Tosend)
        }
        firstController.AllData = Collect
            }

这样没有追加,tosend是空的?

为什么它告诉我无法解包 UserDefaults?

错误消息试图向您解释 UserDefaults.standard 不是 Optional 类型。这意味着它不是 Optional<UserDefaults> 类型,这意味着它不能使用 if-let 语句来解包它。

您要解包的不是 UserDefaults 对象,它已经通过 UserDefaults.standard 属性 作为单例提供。

我可以打开什么?

您要解包的是您要检索的变量。

这些将是您必须处理的可选类型。它是 Optional 因为它可能已经存在于 UserDefaults 中,也可能还不存在。

如何检索存储在 UserDefaults 中的字符串数组?

使用密钥 DCollect,使用适当的方法(即 stringArray(forKey:) 检索它。

let defaults = UserDefaults.standard

if let dcollect = defaults.stringArray(forKey: "DCollect") {
   // it already exists; now use the dcollect variable
} else {
   // it does not exist; do something (i.e. add dcollect value?) if it does not exist yet
}

如何将字符串数组存储到 UserDefaults

let defaults = UserDefaults.standard
let value : [String] = ["My", "Very", "Eager", "Pluto"]
standard.set(value, forKey: "DCollect")

要将某些内容保存为用户默认值:

UserDefaults.standard.set("It is a string", forKey: "meaningfulIdentifier")

从用户默认值中获取一些东西:

if let anyString = UserDefaults.standard.value(forKey: "meaningfulIdentifier") as? String {
    // Do something with anyString
}


当您处理从用户默认设置中获取某些内容时,您只需要可选绑定。对于数据部分,您需要此可选绑定,而不是 User Defaults 本身。

我不确定您为什么要解包 UserDefaults.standard,因为您不需要这样做。它不是可选的,因此您会从 Xcode.

得到错误

您可以像这样直接将值添加到 de UserDefaults 中:

let u = UserDefaults.standard u.set(["a", "b", "c"], forKey: "yourKey")

首先,别忘了import Foundation

然后试试这个代码

func DataToPass(ArrayName: [String]) {
    UserDefaults.standard.set(ArrayName, forKey: "ToCollect")
}


override func prepare(for segue: UIStoryboardSegue, sender: Any?){
    if segue.identifier == "SegueInfo"{
        let firstController = segue.destination as! ViewController
        if let Tosend = UserDefaults.standard.stringArray(forKey: "ToCollect") as? [String] {
            Collect += Tosend
        }
        firstController.AllData = Collect
    }
}