这是我的代码:
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
。
答案 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)
}
}
在这里,我们创建一个由两个数组组成的元组,并根据需要将元素分配给它们,然后将它们分配给您的类属性。