Swift中如何根据messages属性存在性排序Chat数组?
解决Chat数组按messages属性存在性排序的问题
看起来你是想把带有messages属性的Chat对象和没有messages属性的分开排序,但你的代码里犯了一个类型错误——让我帮你拆解问题,再给出正确的实现:
你的代码错误原因
你写的这段代码:
chats.sort { guard let first = $0.messages, let second = $1.messages else { return false } return first && !second }
问题出在first && !second这里:first是[Message]类型的数组,不是布尔值,Swift没法直接把数组当作布尔值来做逻辑运算。而且这个guard语句的逻辑也有问题——如果其中一个Chat没有messages,你直接返回false,这会导致排序结果完全不符合预期。
正确的实现思路
首先明确核心排序需求:我默认你想把有messages属性的Chat排在前面(如果需求相反,调整逻辑即可)。我们需要先判断每个Chat是否存在messages属性,再根据这个布尔值来控制排序优先级。
基础版:仅按messages存在性排序
如果只需要区分“有messages”和“没有messages”两组,不需要同组内的额外排序,可以这样写:
chats.sort { chatA, chatB in // 判断两个Chat是否拥有messages属性 let hasMessagesA = chatA.messages != nil let hasMessagesB = chatB.messages != nil // 规则:有messages的排在前面 if hasMessagesA != hasMessagesB { return hasMessagesA } // 两者都有/都没有时,保持原顺序(或返回true/false调整,按需) return false }
进阶版:存在性+消息数量排序
如果想在“有messages”的组里,再按消息数量从多到少排序,可以补充逻辑:
chats.sort { chatA, chatB in let hasMessagesA = chatA.messages != nil let hasMessagesB = chatB.messages != nil // 先按是否有messages分组排序 if hasMessagesA != hasMessagesB { return hasMessagesA } // 同组内(都有messages)按消息数量排序 if let messagesA = chatA.messages, let messagesB = chatB.messages { return messagesA.count > messagesB.count // 消息多的在前,改成<就是少的在前 } // 都没有messages时,保持原顺序 return false }
特殊需求:仅保留非空messages的Chat在前
如果你想的是“有messages且数组非空”的Chat排在前面(而不是只要有messages属性就算),可以把判断条件改成:
let hasNonEmptyMessagesA = chatA.messages?.isEmpty == false let hasNonEmptyMessagesB = chatB.messages?.isEmpty == false
这样既判断了messages属性存在,又确保数组里有实际的消息内容。
总结
核心是先把“是否有messages”转换成布尔值,再用这个布尔值来控制排序优先级,而不是直接拿数组做逻辑运算。根据你的具体需求选择对应的逻辑即可。
内容的提问来源于stack exchange,提问作者Kira
相关产品推荐
相关产品推荐

