在 swift 3 中使用 .append() 时,数组中的元素被替换,而不是数组获得新元素

Posted

技术标签:

【中文标题】在 swift 3 中使用 .append() 时,数组中的元素被替换,而不是数组获得新元素【英文标题】:when using .append() in swift 3, the element in the array gets replaced instead of the array gaining new element 【发布时间】:2017-02-26 20:08:25 【问题描述】:

背景信息:此应用程序扫描颜色,然后,如果用户愿意,使用 UserDefaults 将颜色保存到 UITableView。这里的变量是程序前面使用的算法的副产品。

当我查看表格时,我保存的不是新元素,而是被替换。

这是代码,我正在尝试将其保存到 userdefaults,但我认为 userdefaults 不是问题。

这些是预定义的数组。他们不属于班级。

var NameList = [String]()
var HexCodeList = [String]()
var RedList = [CGFloat]()
var BlueList = [CGFloat]()
var GreenList = [CGFloat]()

这是将变量添加到其相应数组并将它们保存为用户默认值的函数。这是视图控制器类的一部分

@IBAction func SaveColor(_ sender: Any) 

    let alertController = UIAlertController(title: "Save Color", message: "Please name the color you would like to save:", preferredStyle: .alert)

    let confirmAction = UIAlertAction(title: "Confirm", style: .default)  (_) in
        if let field = alertController.textFields?[0] 
            // store your data
            //ColorList.append(Color(name: field.text!, hexCode: self.hexCode, Red: self.Red, Green: self.Green, Blue: self.Blue))
            //UserDefaults.standard.set(ColorList, forKey: "ColorList")



            NameList.append(field.text!)
            UserDefaults.standard.set(NameList, forKey: "NameList")

            HexCodeList.append(self.hexCode)
            UserDefaults.standard.set(HexCodeList, forKey: "HexCodeList")

            RedList.append(self.Red)
            UserDefaults.standard.set(RedList, forKey: "RedList")

            GreenList.append(self.Green)
            UserDefaults.standard.set(GreenList, forKey: "GreenList")

            BlueList.append(self.Blue)
            UserDefaults.standard.set(BlueList, forKey: "BlueList")

            UserDefaults.standard.synchronize()

            print("NameList - 2nd", NameList)

         else 
            // user did not fill field
        
    

我很确定这是所有重要的代码,但如果您需要更多帮助我,我很乐意将其全部发布

非常感谢

【问题讨论】:

您尝试过建议的答案吗? 【参考方案1】:

问题是您每次都在定义部分创建新列表

 var NameList = [String]() // Nothing here!

比使用.appendsomething 添加到[] 数组,而不是将[something] 保存到UserDefaults。这会用[something] 覆盖默认保存的任何进度。

要保存进度,您需要正确初始化存储属性

lazy var NameList: [String] = UserDefaults.standard.array(forKey: "NameList") as? [String] ?? [String]()

此示例代码从 UserDefaults 中检索 NameList 或将其初始化为空字符串数组(如果没有保存为默认值)。将此 sn-p 用于所有列表。希望这会有所帮助。

附:根据common naming conventions,最好将变量命名为小写,例如 nameList 等。

【讨论】:

以上是关于在 swift 3 中使用 .append() 时,数组中的元素被替换,而不是数组获得新元素的主要内容,如果未能解决你的问题,请参考以下文章

Swift--Array 详解

在 TableView Swift 3 上设置值

在 Swift 中扩展泛型? [复制]

在 Swift 3 中附加一个函数范围之外的变量

Swift:“在展开可选值时意外发现 nil”在数组追加中

swift:修改字典中的数组