我有一个超级类包装器。
class Wrapper {
var id: Int?
var createdAt: Date?
}
我有两个类,分别是子类包装器、消息和事务。
class Message : Wrapper{
/*
Message properties defined
*/
}
class Transaction : Wrapper{
/*
Transaction properties defined
*/
}
现在我有一个显示对话的 UITableview,并且来自"消息"和"事务"类型的两个数组的数据。此视图将显示按创建时间排序的消息和事务。
Conversation 类如下所示:
class Conversation{
var messages : [Message];
var transactions : [Transaction];
}
我的问题是,我如何准确地使用来自两个数组的合并数据来获取 cellforItem 委托方法,按 createdAt 变量的顺序?
您可以通过将数组定义为[Wrapper]
来存储Message
类和Transaction
类的实例,因为两者都是Wrapper
的子类。 然后,您可以按createdAt
属性对数组进行排序,因为您的两个类都从Wrapper
继承此属性。
如果需要根据确切的子类在UITableViewCell
中显示不同的数据,则可以在cellForRowAt
方法中有条件地向下转换Wrapper
对象并采取相应的操作。
创建一个 [wrapper] 数组,将消息和事务数组都放入其中,并按 createdAt 对其进行排序。
我遇到同样的问题不止两次。如果您确实不想破坏数据,则可以index array
索引数据。
例:
enum ArrayType {
case message
case transaction
}
let messages = [Int]()
let transactions = [Int]()
var indexes = [Index]()
struct Index {
var arrayIndex = 0
var arrayType = ArrayType.message
}
func indexYourData() {
indexes = []
var messagesIndexDone = messages.count==0
var transactionIndexDone = transactions.count==0
var messageIndex = 0
var transactionIndex = 0
var appendTypeIsMessage = false
while !messagesIndexDone || !transactionIndexDone {
appendTypeIsMessage = false
if transactionIndexDone {
appendTypeIsMessage = true
} else if messagesIndexDone {
appendTypeIsMessage = false
} else {
appendTypeIsMessage = messages[messageIndex].date > transactions[transactionIndex].date
}
if appendTypeIsMessage {
indexes.append(Index.init(arrayIndex: messageIndex, arrayType: .message))
messageIndex += 1
messagesIndexDone = messageIndex>=messages.count
} else {
indexes.append(Index.init(arrayIndex: transactionIndex, arrayType: .transaction))
transactionIndex += 1
transactionIndexDone = transactionIndex>=transactions.count
}
}
}