我想在Swift数组上创建一个Swift 4扩展。该函数应该就地对数组进行排序。
编译器抱怨似乎假设数组是不可变的,因为它抱怨我创建的函数。我想解决这个问题,但不知道怎么做。请注意,要求是对数组进行就地排序(使用排序)而不是创建新数组(就像使用排序一样)。
public ref class MyClass {
public:
MyClass() {
A1 = gcnew array<int, 2>(3, 3) {
{ 1, 1, 1 },
{ 1, 1, 1 },
{ 1, 1, 1 },
};
};
MyClass(array<int, 2> ^(&A1), const int &i2) : A1(A1), I2(i2) {};
String^ Method();
~MyClass() {};
private:
array<int, 2>^ A1;
int I2 = 5;
};
编译器抱怨:不能在不可变值上使用变异成员:&#39; self&#39;是不可改变的
答案 0 :(得分:4)
您希望调用sorted(by:)
,它返回一个新的,已排序的Array
实例,而不是sort(by:)
,它会进行排序,从而改变Array
。< / p>
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})
}
}
创建。
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="Project.Views.DummyPage111">
<TabbedPage.Children>
<ContentPage Title="Tab 1">
<Label Text="Page 1" />
</ContentPage>
<ContentPage Title="Tab 2">
<Label Text="Page 2" />
</ContentPage>
<ContentPage Title="Tab 3">
<Label Text="Page 3" />
</ContentPage>
<ContentPage Title="Tab 4">
<Label Text="Page 4" />
</ContentPage>
</TabbedPage.Children>
</TabbedPage>
答案 1 :(得分:1)
sort
是一个可变函数,用于对Array
就地排序。 sorted(by:)
是您正在寻找的功能。将sort
重命名为sorted
。
如果您希望对就地Array
进行排序,请重写您的函数声明以包含mutating
限定符。
以下内容:
func custom_sort()
变为:
mutating func custom_sort()
变异函数sort(by:)
不会返回任何内容,因此您的return
是错误的。同时删除-> [MyStruct]
。
答案 2 :(得分:1)
两个问题:
mutating
如果您想排序,则没有返回值
extension Array where Element == MyStruct {
mutating func customSort() {
sort { $0.field < $1.field }
}
}
请注明方法/功能 camelCased 。