Swift 4数组扩展原地排序的可变性报错问题咨询
这个问题我之前也碰到过,其实核心就是Swift值类型的可变规则在搞鬼,给你一个直接能用的解决方案,再掰扯清楚为啥报错~
完整解决方案代码
struct MyStruct { var field: String } typealias MyStructList = [MyStruct] extension MyStructList { // 必须加上mutating关键字,表明这个方法会修改数组本身 mutating func sortByField() { // 调用系统的原地sort方法,传入自定义排序规则 sort { $0.field < $1.field } } }
报错原因拆解
你遇到的编译器提示“数组不可变”,本质是两个点:
- Swift里的数组是值类型,用
let声明的数组实例是完全不可变的,任何试图修改它的操作都会报错; - 如果你要在扩展里定义一个能修改数组自身的方法,必须给方法加上
mutating关键字——这是值类型的规则,告诉编译器这个方法会改变实例的内部状态。
使用示例
注意!调用这个排序方法的数组必须是用var声明的可变实例:
// 用var声明可变数组 var myList: MyStructList = [ MyStruct(field: "banana"), MyStruct(field: "apple"), MyStruct(field: "cherry") ] // 调用自定义的原地排序方法 myList.sortByField() // 此时myList的顺序已经变成apple → banana → cherry print(myList.map { $0.field }) // 输出 ["apple", "banana", "cherry"]
如果你的数组是用let声明的,哪怕调用系统的sort()方法也会报错,更别说自定义的了——所以一定要确保实例是可变的(用var)。
内容的提问来源于stack exchange,提问作者Johannes
相关产品推荐
相关产品推荐

