Расширение Swift Array - проблема изменчивости - PullRequest
0 голосов
/ 07 мая 2018

Я хотел бы создать расширение Swift 4 на массиве Swift. Функция должна отсортировать массив на месте.

Кажется, что компилятор полагает, что массивы неизменны, так как он жалуется на созданную мной функцию. Я хотел бы решить это, но не знаю как. Обратите внимание, что необходимо отсортировать массив на месте (с помощью 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' является неизменным

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

Вы хотите вызывать 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})
    }
}
0 голосов
/ 07 мая 2018

Два выпуска:

  1. Вы должны отметить функцию как mutating
  2. Если вы хотите отсортировать на месте , возвращаемое значение отсутствует

    extension Array where Element == MyStruct {
        mutating func customSort() {
            sort { $0.field < $1.field }
        }
    }
    

И, пожалуйста, назовите методы / функции camelCased .

0 голосов
/ 07 мая 2018

sort - это изменяемая функция, которая сортирует Array на месте. sorted(by:) - это функция, которую вы ищете. Переименуйте sort в sorted.

Если вы хотите отсортировать Array на месте, перепишите объявление функции, включив в него квалификатор mutating.

Итак, следующее:

func custom_sort()

становится:

mutating func custom_sort()

Мутирующая функция sort(by:) ничего не возвращает, поэтому ваш return ошибочен. Удалите также -> [MyStruct].

...