gpt4 book ai didi

arrays - swift中连续数组的数据结构

转载 作者:行者123 更新时间:2023-11-28 13:54:57 25 4
gpt4 key购买 nike

我有两个数组,连续使用。

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com