在一个循环中初始化多个不可变数组

时间:2019-04-15 18:44:23

标签: swift

这是我的代码:

city

我在数组coord_flip()上循环了两次。有什么方法可以让我初始化儿子和女儿而只在class Birthgiver {} class Son: Birthgiver {} class Daughter: Birthgiver {} class BirthgiverHolder { let sons: [Son] let daughters: [Daughter] init(birthGivers: [Birthgiver]) { // How to initializer both sons and daugthers in 1 loop? // This is my current way (looping twice): sons = birthGivers.compactMap { $0 as? Son } daughters = birthGivers.compactMap { $0 as? Daughter } } } 上循环一次?我不想将数组标记为birthGivers

3 个答案:

答案 0 :(得分:3)

方法1:使用本地变量,并在完成后填充常量:

init(birthGivers: [Birthgiver]) {
    var sons: [Son] = []
    var daughters: [Daughter] = []

    for child in birthGivers {
        switch child {
            case let son as Son: sons.append(son)
            case let daughter as Daughter: daughters.append(daughter)
            default: break
        }
    }

    self.sons = sons
    self.daughters = daughters
}

选项2:您也可以使用reduce(into:)来实现它(尽管我个人认为上述内容更具可读性):

init(birthGivers: [Birthgiver]) {
    (sons, daughters) = birthGivers.reduce(into: ([], [])) {
        switch $1 {
        case let son as Son: $0.0.append(son)
        case let daughter as Daughter: $0.1.append(daughter)
        default: break
        }
    }
}

选项3:坚持使用compactMap方法:

init(birthGivers: [Birthgiver]) {
    sons = birthGivers.compactMap { $0 as? Son }
    daughters = birthGivers.compactMap { $0 as? Daughter }
}

在大多数情况下,最后一个选项就足够了。您需要大量的记录才能观察到性能差异。

答案 1 :(得分:0)

您可以重构该代码以使其循环一次,但它要复杂得多且难以阅读。除非您在birthgiver数组中有数百个对象,否则这可能不值得。

class BirthgiverHolder {
    let sons: [Son]
    let daughters: [Daughter]

    init(birthGivers: [Birthgiver]) {
        var sons = [Son]()
        var daughters = [Daughter]()
        for giver in birthGivers {
            if let son = giver as? Son { sons.append(son) }
            else if let daughter = giver as? Daughter { daughters.append(daughter) }
        }

        self.sons = sons
        self.daughters = daughters
    }
}

答案 2 :(得分:0)

如前所述,这不太可能对性能产生任何影响。如果您确实想尝试,可以使用reduce

(sons, daughters) = birthGivers.reduce(into: ([Son](),[Daughter]())) {arrays, element in
    if let element = element as? Son {
        arrays.0.append(element)
    } else if let element = element as? Daughter {
        arrays.1.append(element)
    }
}

在这里,我们创建一个由两个数组组成的元组,并根据需要将元素分配给它们,然后将它们分配给您的类属性。