我有两个数组,连续使用。
var pinnedMessage: [Message]
var normalMessage: [Message]
首先
我将固定消息添加到第一个数组,将普通消息添加到第二个数组。但我总是连续使用两个数组。所以当我使用它们时,我创建了一个新数组,首先附加固定消息,然后附加普通消息。
var newArray: [Message] = []
newArray.append(pinnedMessage)
newArray.append(normalMessage)
第二
另一种方法是,我将两条消息放在一个数组中,然后根据它们的 isPinned
属性对它们进行排序。
GlobalArray.sort { $0.isPinned && !$1.isPinned }
我还应该知道第一条普通消息的索引在哪里。所以我也有一个变量。
我不认为这些想法是否可以。我应该使用链表还是其他数据结构?
最佳答案
您可以改变访问数组的方式,而不是使用您列出的任何替代方法。您可以使用辅助函数,将闭包作为参数来处理数组中的每个元素:
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,等于普通消息的第一个索引。
关于arrays - swift中连续数组的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54003624/