扩展 swift 数组 -- 可变性问题



我想在 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})
}
}

两个问题:

  1. 您必须将函数标记为mutating
  2. 如果要就地排序,则没有返回值

    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]

最新更新