Swift 我可以通过引用声明局部数组变量以减少重复代码吗

Swift 我可以通过引用声明局部数组变量以减少重复代码吗,swift,reference,Swift,Reference,所以我知道Swift数组是struct,所以它们是按值传递的 这是我的密码: firstSnapshotList和secondSnapshotList都是[快照] if datePicker == firstDatePicker { firstSnapshotList.removeAll() if let snapshots = SnapshotList.snapshotDict[dateKey] { for snapshot i

所以我知道Swift数组是
struct
,所以它们是按值传递的

这是我的密码:

firstSnapshotList
secondSnapshotList
都是
[快照]

    if datePicker == firstDatePicker {
        firstSnapshotList.removeAll()

        if let snapshots = SnapshotList.snapshotDict[dateKey] {
            for snapshot in snapshots {
                firstSnapshotList.append(snapshot)
            }
        }
    } else if datePicker == secondDatePicker {
        secondSnapshotList.removeAll()

        if let snapshots = SnapshotList.snapshotDict[dateKey] {
            for snapshot in snapshots {
                secondSnapshotList.append(snapshot)
            }
        }
    }
如您所见,如果
if
语句中的两个块都相同,除了修改的数组之外

我想先声明一个变量,
var snapshotList=*snapshot reference*
, 然后,如果我可以根据日期选择器将该引用设置为
firstSnapshotList
secondSnapshotList
,那么我的代码就是

if datePicker == firstDatePicker {
    snapshotList = firstSnapshotList
} else if datePicker == secondDatePicker {
    snapshotList = secondSnapshotList
}

snapshotList.removeAll()

if let snapshots = SnapshotList.snapshotDict[dateKey] {
    for snapshot in snapshots {
        snapshotList.append(snapshot)
    }
}
你可能会说行数是一样的,所以它实际上没有任何可读性或可维护性——这只是我个人的偏好,我认为第二个版本更有意义,主要是因为没有任何重复代码

但如果这只是快速生活方式的一部分,我也可以接受。只是想知道是否有可能将变量声明为引用

与标准库中的所有可变大小集合一样,数组使用写时复制优化。阵列的多个副本共享同一存储,直到您修改其中一个副本为止。当这种情况发生时,被修改的阵列将用其自身唯一拥有的副本替换其存储,然后对其进行就地修改。有时会应用优化来减少复制量


您的代码可以简化到无需减少代码重复的程度:

let newSnapshotList = SnapshotList.snapshotDict[dateKey] ?? []

if datePicker == firstDatePicker {
    firstSnapshotList = newSnapshotList
} else if datePicker == secondDatePicker {
    secondSnapshotList = newSnapshotList
}
但是为了回答这个问题,可以通过在现有函数中声明一个嵌套函数来实现:

func overrideFromSnapshotDict(destination: inout [YourType]) {
    destination.removeAll()
    if let snapshots = SnapshotList.snapshotDict[dateKey] {
        for snapshot in snapshots {
            destination.append(snapshot)
        }
    }
}

if datePicker == firstDatePicker {
    overrideFromSnapshotDict(destination: &firstSnapshotList)
} else if datePicker == secondDatePicker {
    overrideFromSnapshotDict(destination: &secondSnapshotList)
}

正如您所说,Swift数组是结构,它们实际上是作为值传递的。您可以将数组作为
inout
参数传递给单独的方法:

func yourMethodName(_ array: inout [Snapshot]) {
    array.removeAll()

    if let snapshots = SnapshotList.snapshotDict[dateKey] {
        for snapshot in snapshots {
            array.append(snapshot)
        }
    }
}
然后在需要的地方调用该方法,如下所示:

if datePicker == firstDatePicker {
    yourMethodName(&firstSnapshotList)
} else if datePicker == secondDatePicker {
    yourMethodName(&secondSnapshotList)
}

如果您想通过引用存储数组,仍然有一个
NSMutableArray
class
解决方案,所以赋值就是引用。但是本机集合也共享内部内存,因此实际上您的stuct数组并没有完全复制,它只是指向同一个数组,当这些“副本”中的任何一个试图修改其内容时,将创建一个完整的内部副本到另一个实例,它开始指向新的缓冲区。您也可以使用
.append(contentsOf:snapshots)
这也比“按一添加”更快您可以使用
guard let snapshots=SnapshotList.snapshotDict[dateKey]else{return}
来消除该部分的重复数据。或者编写一个扩展名
reset(使用dateKey:String)
,它可以满足您的需要。