Подтвердить что ты не робот

В чем разница между массивом <T>, ContiguousArray <T> и ArraySlice <T> в Swift?

В Swift 2, каково основное различие между тремя вариантами массива:

  • Массив
  • ContiguousArray
  • ArraySlice

Может ли кто-нибудь объяснить это с помощью примера реального мира?

4b9b3361

Ответ 1

В docs:

ContiguousArray:

Эффективность эквивалентна эффективности Array, если T не является типом класса или типа @objc, и в этом случае использование ContiguousArray может быть более эффективным. Обратите внимание, однако, что ContiguousArray не соединяется с Objective-C. См. "Массив", с которым ContiguousArray разделяет большинство свойств, более подробно.

В принципе, всякий раз, когда вы храните типы классов или @objc протокола в массиве, вам может потребоваться использовать ContiguousArray вместо Array.

ArraySlice

ArraySlice всегда использует непрерывное хранилище и не соединяется с Objective-C.

Предупреждение: Долгосрочное хранение экземпляров ArraySlice не рекомендуется

Так как ArraySlice представляет вид на хранение некоторого большего размера массив даже после окончания срока службы исходного массива, сохранение фрагмента может продлить срок службы элементов, которые больше не доступны, которые могут проявляться в виде явной памяти и утечки объекта. Предотвращать этот эффект, используйте ArraySlice только для временных вычислений.

ArraySlices используются в большинстве случаев, когда вы хотите получить поддиапазон из массива, например:

let numbers = [1, 2, 3, 4]
let slice = numbers[Range<Int>(start: 0, end: 2)] //[1, 2]

Любые другие случаи, которые вы должны использовать Array.

Ответ 2

Swift определяет следующие классы, реализующие протокол ArrayType; Массив, ContiguousArray, Slice.

Swift Array является основным классом, который представляет массивы. Массив - это общий класс, который принимает 1 тип. Массив целых чисел будет иметь тип Array<Int>, создающий целочисленный массив:

var myArray = Array<Int>()

Slice - это массив с внутренней реализацией, который делает удаление элементов из вершины массива вычислительно дешевым. Следующие свойства будут выполняться в режиме Slice:

var arr = [1,2,3,4,5]
arr[1…4]

Существует не так много документации относительно ContiguousArray, но из его имени можно догадаться, что это связано с внутренним хранилищем массива, возможно, элементы хранятся в макете смещения памяти.

Подробнее.

Ответ 3

Хороший источник для разных классов Swift: http://swiftdoc.org/

Массив очень ясен, поэтому давайте поговорим о других двух.

ContiguousArray: http://swiftdoc.org/type/ContiguousArray/

Быстрый, смежно хранимый массив T.

Эффективность эквивалентна эффективности массива, если T не является классом или @objc, в этом случае использование ContiguousArray может быть больше эффективный. Обратите внимание, однако, что ContiguousArray не соединяется с Objective-C. См. "Массив", с которым свойств, более подробно.

ArraySlice: http://swiftdoc.org/type/ArraySlice/

Тип, подобный массиву, который представляет подпоследовательность любого массива, ContiguousArray или другое ArraySlice.

ArraySlice всегда использует непрерывное хранилище и не соединяется с ним Objective-C.

Короче:

ContiguousArray для большей эффективности, если T является типом класса или типа @objc ArraySlice должен представлять Array в подчасти.

Ответ 4

В Apple появился новый документ. https://git.io/vg5uw

Итак,

ContiguousArray<Element> - это самый быстрый и простой из трех вариантов использования это, когда вам нужна производительность "C array". Элементы ContiguousArray всегда хранятся в памяти в памяти.

.

Array<Element> похож на ContiguousArray<Element>, но оптимизирован для эффективные преобразования из Cocoa и обратно - когда элемент может быть классом тип, Array<Element> может поддерживаться (потенциально несмежным) хранение произвольного NSArray, а не Swift ContiguousArray. Array<Element> также поддерживает up- и downcasts между массивами связанных классов. Когда Элемент известен как неклассовый тип, производительность Array<Element> идентична производительности ContiguousArray<Element>.