所以我知道swift数组是struct,所以它们是按值传递的
这是我的代码:
firstSnapshotListsecondSnapshotList都是[Snapshot]

    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*
然后,如果我可以根据日期选择器将引用设置为firstSnapshotListsecondSnapshotList,那么我的代码就是
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)
    }
}

你可以说行数是一样的,所以它实际上不再可读或可维护了——这只是我个人的喜好,我认为第二个版本更有意义,主要是因为没有任何重复的代码
但如果这只是快速生活方式的一部分,我也可以忍受。只是想知道是否可以将变量声明为引用

最佳答案

正如您所说,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)
}

关于swift - 我可以通过引用声明局部Array变量,以减少重复代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51163699/

10-11 22:59
查看更多