Swift中如何根据User对象的userName参数对对象数组排序?
解决Swift User数组按userName排序的问题
嘿,我看你这里的问题主要出在两个小细节上,咱们来一步步修正:
1. 首先纠正属性名错误
你的User类里定义的是userName属性,但你写的排序代码里用了$0.name!——这里的name根本不是User类的成员,编译器肯定会报错。首先要把name改成userName。
2. 避免强制解包可选值的风险
直接用!强制解包userName很危险,如果数组里有某个User对象的userName是nil,运行时会直接崩溃。推荐用更安全的方式处理可选值:
方式一:用空合并运算符处理默认值
如果想把userName为nil的对象统一排到最后(或者最前,取决于空字符串的比较逻辑),可以这样写:
userArray = userArray.sorted(by: { ($0.userName ?? "") < ($1.userName ?? "") })
这里?? ""表示如果userName是nil,就用空字符串来参与比较,既避免崩溃,又能保证排序逻辑的一致性。
方式二:更严谨的可选值分支处理
如果你想明确控制nil值的排序位置(比如把无userName的放到最后),可以用switch分支做精细化处理:
userArray = userArray.sorted { switch ($0.userName, $1.userName) { case (let a?, let b?): // 两个对象都有userName,直接比较字符串 return a < b case (nil, _): // 第一个对象无userName,排到后面,返回false return false case (_, nil): // 第二个对象无userName,第一个排前面,返回true return true } }
测试验证
我用你给出的示例数据创建了User数组测试,用上面的代码排序后,得到的结果完全符合你的预期:[(Amar, S, AmarS, 3),(Prema, A, PremaA, 2),(Shyam, M, ShayamM, 1)]
内容的提问来源于stack exchange,提问作者Lavanya v gowda
相关产品推荐
相关产品推荐

