我想在 Swift Array 上创建一个 Swift 4 扩展。该函数应就地对数组进行排序。
编译器抱怨似乎假设数组是不可变的,因为它抱怨我创建的函数。我想解决这个问题,但不知道如何解决。请注意,要求是就地对数组进行排序(使用 sort),而不是创建一个新数组(就像对排序所做的那样)。
struct MyStruct {
var field: String
}
typealias MyStructList = [MyStruct]
// requirement: extend MyStructList with custom sort
extension Array where Element == MyStruct {
func customSort() -> [MyStruct] {
return sort { $0.field < $1.field }
}
}
编译器抱怨:不能在不可变值上使用突变成员:"self"是不可变的
你想调用sorted(by:)
,它返回一个新的、排序Array
实例而不是sort(by:)
,它就地进行排序,从而改变Array
。
extension Array where Element == MyStruct {
func customSort() -> [MyStruct] {
return sorted(by: {$0.field < $1.field})
}
}
如果你真的想对Array
进行排序,你必须将你的customSort
函数标记为变异,并更改函数签名以返回Void
,因为没有创建新的Array
。
extension Array where Element == MyStruct {
mutating func customSort() {
sort(by: {$0.field < $1.field})
}
}
两个问题:
- 您必须将函数标记为
mutating
-
如果要就地排序,则没有返回值
extension Array where Element == MyStruct { mutating func customSort() { sort { $0.field < $1.field } } }
并请命名方法/函数骆驼。
sort
是一个可变函数,用于就地对Array
进行排序。sorted(by:)
是您正在寻找的功能。将sort
重命名为sorted
。
如果要就地对Array
进行排序,请重写函数声明以包含mutating
限定符。
所以以下内容:
func custom_sort()
成为:
mutating func custom_sort()
突变函数sort(by:)
不返回任何内容,因此您的return
是错误的。也删除-> [MyStruct]
。