Swift:按字母排序对象数组并将指定字段匹配的对象前置
实现特定国家地点前置+名称排序的解决方案
问题背景
你定义了如下Location结构体:
struct Location: Identifiable, Codable { var id: String var name: String var country: String }
原本可以通过以下代码按名称排序:
self.userData = self.userData.sorted(by: {$0.name < $1.name })
现在需要实现:将特定国家(如美国)的地点排在列表最前面,剩余地点再按名称字母排序。你尝试的代码出现语法错误:
self.userData.sorted(by: { ($0.country == "United States"), ($0.name < $1.name) })
错误提示:Consecutive statements on a line must be separated by ;
解决方案
你之前的错误是用逗号分隔两个条件,这不符合Swift闭包的语法要求——sorted(by:)需要的是一个返回Bool值的闭包,必须把两个排序规则合并成一套逻辑判断。
正确的思路是:先判断两个元素是否属于目标国家,根据归属情况决定优先级,再对同组元素按名称排序。
基础实现代码
self.userData = self.userData.sorted(by: { // 标记两个元素是否属于目标国家 let isUS0 = $0.country == "United States" let isUS1 = $1.country == "United States" // 优先级判断:美国地点在前 if isUS0 != isUS1 { return isUS0 } // 同国家时按名称排序 else { return $0.name < $1.name } })
优化版(可复用)
如果后续需要切换目标国家,可将目标国家抽为常量,提升代码可维护性:
let priorityCountry = "United States" self.userData = self.userData.sorted(by: { let isPriority0 = $0.country == priorityCountry let isPriority1 = $1.country == priorityCountry if isPriority0 != isPriority1 { return isPriority0 } else { return $0.name < $1.name } })
内容的提问来源于stack exchange,提问作者hoptown
相关产品推荐
相关产品推荐

