Преобразование мутирующего массива в неизменяемый на месте - PullRequest
0 голосов
/ 15 января 2020

У меня есть такой код:

let array = self.doSomething(Array<UInt8>([10, 29, 33]).reverse())

проблема в том, что doSomething ожидает неизменяемый массив, а функция reverse() возвращает мутирующий.

Как преобразовать Array<UInt8>([10, 29, 33]).reverse() в неизменяемый массив вместо , не создавая еще одну строку кода, что-то вроде

let array = self.doSomething(Array<UInt8>([10, 29, 33]).reverse().nonMutating)

1 Ответ

2 голосов
/ 15 января 2020

Нет никаких "мутирующих" и "не мутирующих" массивов. Проблема в том, что вы, скорее всего, создаете коллекцию ReversedCollection и вам нужен массив. Вы можете создать это, создав массив из коллекции:

let array = self.doSomething(Array(Array<UInt8>([10, 29, 33]).reversed()))

Обратите внимание, что метод reversed() здесь не reverse(). reverse() возвращает Void (который вы можете принять за «мутирующий массив»).

Если вы имеете в виду «Я хочу изменить массив на месте, а затем передать его чему-то другому», то есть два действия и требуется два утверждения. Хотя возможно обойтись с дополнительными функциями, в этом нет особого смысла. reversed() - это O (1), а Array.init(collection) - это O (N), так что все это O (N), что совпадает с Array.reversed. Если существует проблема выделения памяти, добавьте дополнительную строку. Очень сложно передавать массивы в изменяющиеся функции и быть абсолютно уверенными, что копии не будут сделаны (Swift не дает никаких обещаний относительно предотвращения копирования).

Обычно я бы переписал doSomething здесь, чтобы принять коллекцию а не массив.

...