Ios 更新阵列,智能方式?

Ios 更新阵列,智能方式?,ios,swift,Ios,Swift,我正在使用一个包含变量的结构'xyz'。这些变量是数组的一部分。“arr_instruction”的副本在TVC中用作数据源 这是一个可行的方案,但我对解决方案不满意 缺点1:我需要知道变量在“arr\u指令”中的确切位置(indexPath) 缺点2:变得非常拥挤且无法阅读 如何以更智能的方式更新数组有什么建议吗 数据文件 import Foundation struct xyz { //-> Variablen für Array //didSet updates t

我正在使用一个包含变量的
结构'xyz'
。这些变量是数组的一部分。“
arr_instruction
”的副本在TVC中用作
数据源

这是一个可行的方案,但我对解决方案不满意

缺点1:我需要知道变量在“
arr\u指令”
中的确切位置(
indexPath

缺点2:变得非常拥挤且无法阅读 如何以更智能的方式更新
数组
有什么建议吗

数据文件

import Foundation

struct xyz {
    //-> Variablen für Array
    //didSet updates the array in struct after value of variable was changed
    static var text0:String = "Entry 0" {didSet{arr_InStruct[0][0] = text0}}//push update 'arr_InStruct' bei Änderung
    static var text1:String = "Entry 1" {didSet{arr_InStruct[0][1] = text1}}//push update 'arr_InStruct' bei Änderung
    static var text2:String = "Entry 2" {didSet{arr_InStruct[0][2] = text2}}//push update 'arr_InStruct' bei Änderung
    static var text3:String = "Entry 3" {didSet{arr_InStruct[0][3] = text3}}//push update 'arr_InStruct' bei Änderung
    //<- Variablen für Array

    //disadvantage 1: I need to know the exact position (indexPath) of the variable within 'arr_InStruct'
    //disadvantage 2: becomes very crowded und unreadable
    //is there a smarter way to archive an array update?

    //2D Array
    //es wird gefüllt mit dem Inhalt der obigen Variablen
    static var arr_InStruct:[[String]] =
    [
        [
            text0,
            text1,
            text2,
            text3,
        ]
    ]//end arr_InStruct
}//end struct xyz
<代码>导入基础 结构xyz{ //->可变für阵列 //didSet在变量值更改后更新结构中的数组 静态变量text0:String=“条目0”{didSet{arr_指令[0][0]=text0}//推送更新'arr_指令'beiÄunderung 静态变量text1:String=“条目1”{didSet{arr_指令[0][1]=text1}//推送更新'arr_指令'beiÄunderung 静态变量text2:String=“条目2”{didSet{arr_指令[0][2]=text2}//推送更新'arr_指令'beiÄunderung 静态变量text3:String=“条目3”{didSet{arr_指令[0][3]=text3}//推送更新'arr_指令'beiÄunderung //>>用于电视的w数据阵列 让arr_头=[“节0”]//1D数组 var arr_Data=xyz.arr_指令{//ArrayFile.swift'->struct'xyz'中的2D数组 didSet{//didSet将在每次更改数组中的内容时调用 DispatchQueue.main.async{self.tableView.reloadData()} }//末日 }//末端变量 //马克:>行动 @iAction func changePressed(\发送方:UIBarButtonim){ 打印(“”) 变压 TVC中的arr\U数据:\(arr\U数据)仅其示例

let newArrUsingMap = arrayToUpdate.map { $0 * 10 }

您可以使用map功能更新这样的完整数组,请告诉我您的问题的详细信息

首先,您的
结构XYZ发布了一些

  • 除非您在多个位置使用同一对象,否则无需将其内部的所有内容都设置为静态。而是在您想使用的任何位置创建一个
    XYZ
    实例

  • 不要将
    didSet
    观察员设置为所有
    text0、text1、text2和text3
    ,而是将
    arr\u指令
    作为计算属性。这样
    arr\u指令
    将始终返回更新的值

  • 所以,
    XYZ
    就像

    struct XYZ {
        var text0 = "Entry 0"
        var text1 = "Entry 1"
        var text2 = "Entry 2"
        var text3 = "Entry 3"
    
        var arr_InStruct: [[String]] {
            return [[text0, text1, text2, text3]]
        }
    }
    
    接下来,在控制器
    reloadTVTest
    中,创建
    XYZ
    的实例,并将其用作
    表视图的
    数据源

    class reloadTVTest: UITableViewController {
        let arr_Header = ["Section 0"]
        var xyz = XYZ() {
            didSet {
                self.tableView.reloadData()
            }
        }
    
        //MARK: - >>> Actions
        @IBAction func changePressed(_ sender: UIBarButtonItem) {
            xyz.text1 = "Entry changed " + randomString(length: 3) //change Variable in 'xyz'
        }
    
        override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return xyz.arr_InStruct[section].count
        }
    
    
        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "cellreloadTVTest", for: indexPath)
            let name = xyz.arr_InStruct[indexPath.section][indexPath.row]
            cell.textLabel?.text = name
            return cell
        }
    
        //rest of the code....
    }
    

    arr_instruction
    的目的是什么?您是否试图将单个结构映射到多个表视图行?您希望为arraySo更新什么值基本上您有两个数据结构和一个从第一个到第二个的转换。关于转换如何工作的知识是错误的。是吗?@Paulw11:first:我是dea使用多个TVC,它们的结构都相同。我只需要更改数据源数组(例如arr_数据)开始时,可以保留大部分剩余内容。第二:struct中的变量用于serval TV。我想要一个位置来更新值和一种自动更新数组的方法。@matt:我不确定这是不是正确的方法。我的基本目标是更改变量的值,同时更新所有相关的TV。使用didSet在TCV中工作得很好,也很简单,但是要更新下划线数组(arr_指令)似乎是一个群体。也许这种方法不正确。或者与其将结构转换为数组中的文本,为什么不使用一个结构数组,并引用您需要的字段?这样,如果您的结构在以后某个日期发生更改,它将不会破坏任何东西。@Flanger我认为这是OP提供的虚拟结构。@pgDev我假设它是,而且它是镜像生产数据结构。但是我误读了它,认为数组在结构之外,而不是它的一个属性。尽管如此,它仍然看起来像是一个奇怪的数据结构,结构在一个双嵌套数组中表示它的值。我怀疑如果这一点得到了优化,解决方案的其余部分可能会出现问题n将变得更简单。@PGDev:works,我对您的all的反应速度印象深刻!非常感谢。创建单个实例会导致代码更简单。@RvdH这就是我所说的“拉”的意思。不是每个变量都知道自己在数组中的位置(“推”),而是一个知道其中变量位置的数组(“拉”)。
    class reloadTVTest: UITableViewController {
        let arr_Header = ["Section 0"]
        var xyz = XYZ() {
            didSet {
                self.tableView.reloadData()
            }
        }
    
        //MARK: - >>> Actions
        @IBAction func changePressed(_ sender: UIBarButtonItem) {
            xyz.text1 = "Entry changed " + randomString(length: 3) //change Variable in 'xyz'
        }
    
        override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return xyz.arr_InStruct[section].count
        }
    
    
        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "cellreloadTVTest", for: indexPath)
            let name = xyz.arr_InStruct[indexPath.section][indexPath.row]
            cell.textLabel?.text = name
            return cell
        }
    
        //rest of the code....
    }