Swift中如何按String类型的name属性对Employee数组排序?
解决按name属性排序失效的问题
嘿,我一眼就发现问题所在了——Swift是严格区分大小写的语言,你在排序闭包里写错了属性名!
你的employee类里定义的属性是小写的name,但你在sorted(by:)里写成了大写的Name,这就导致闭包无法正确访问对象的name属性,自然不会按预期排序。
修正步骤
- 把排序闭包里的
$0.Name和$1.Name改成$0.name和$1.name - 顺便提一句:Swift的命名规范里,类名应该用大驼峰(比如
Employee而非employee),这样代码可读性更好,我在示例里也帮你修正了这个细节
修正后的完整代码
class Employee: Comparable { var id = 10 var name = "Deepak" init() { } init(id: Int, name: String) { self.id = id self.name = name } static func == (lhs: Employee, rhs: Employee) -> Bool { return lhs.id == rhs.id && lhs.name == rhs.name } static func < (lhs: Employee, rhs: Employee) -> Bool { if lhs.id != rhs.id { return lhs.id < rhs.id } else { return lhs.name < rhs.name } } } var a1 = Employee(id: 15, name: "Deepak") var b1 = Employee(id: 10, name: "Shekhar") var employeeArray = [a1, b1] // 修正属性名后的排序代码 var newEmployeeArray = employeeArray.sorted(by: {$0.name < $1.name}) // 打印验证:现在会输出Shekhar对应的id 10,然后是Deepak的15 print(newEmployeeArray[0].id, newEmployeeArray[1].id, separator:",")
额外说明
你之前用employeeArray.sorted()能生效,是因为你实现了Comparable协议的<方法,默认排序会遵循这个方法里的逻辑(先按id排序,id相同时再按name排序)。而自定义的sorted(by:)闭包因为属性名错误,相当于没有提供有效的排序逻辑,所以没有达到预期效果。
内容的提问来源于stack exchange,提问作者dakrawat
相关产品推荐
相关产品推荐

