Вместо того, чтобы использовать любую из перечисленных вами альтернатив, вы можете вместо этого изменить способ доступа к своим массивам.Вы можете использовать вспомогательную функцию, принимая в качестве аргумента замыкание, для обработки каждого элемента в массивах:
struct Message {
let text: String
}
let pinnedMessages: [Message] = [Message(text: "I'm pinned"), Message(text: "I'm also pinned")]
let normalMessages: [Message] = [Message(text: "I'm normal"), Message(text: "I'm also normal")]
@inline(__always)
func foreachMessage(function: (Message) throws -> ()) rethrows {
try pinnedMessages.forEach(function)
try normalMessages.forEach(function)
}
Если вам также необходимо знать тип сообщения, вам следует либо обработатьмассивы по отдельности, без вспомогательной функции, или пусть ваше закрытие принимает другой аргумент:
enum MessageType {
case pinned
case normal
}
@inline(__always)
func foreachMessage(function: (Message, MessageType) throws -> ()) rethrows {
try pinnedMessages.forEach { try function($0, .pinned) }
try normalMessages.forEach { try function($0, .normal) }
}
foreachMessage { message in
print(message)
}
foreachMessage { message, type in
print(message, type)
}
Использование такого метода освобождает вас от недостатка объединения двух массивов: памяти и накладных расходов на производительность.
Если вы отображаете эти сообщения, как если бы они были в одном массиве, индекс первого обычного сообщения будет просто после индекса последнего сообщения в массиве pinnedMessages
.pinnedMessages.count
будет равен последнему индексу этого массива + 1, равному первому индексу нормальных сообщений.