扩展swift Array - 可变性问题

时间:2018-05-07 11:16:41

标签: arrays swift

我想在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;是不可改变的

3 个答案:

答案 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)

两个问题:

  1. 您必须将该功能标记为mutating
  2. 如果您想排序,则没有返回值

    extension Array where Element == MyStruct {
        mutating func customSort() {
            sort { $0.field < $1.field }
        }
    }
    
  3. 请注明方法/功能 camelCased