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

标签 arrays swift data-structures

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

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/

相关文章:

c - c 中的指针(初学者)

python - 概念 - 如何在 Python 中构建 2D 词频矩阵?

ios - 如何在 IOS swift 中连接到 Mattermost 服务器?

swift - 有没有一种方法可以使用 Alamofire 进行指数退避重试

c# - 列表包含字典包含列表

c++ - 无法将结构分配给结构指针

c++ - 静态分配的数据结构

python - 创建键值对的数组列

javascript - 如何检查和替换数组中的值?

ios - 在 View Controller 的单个 Collection View 中显示多个图表,如条形图、饼图、折线图