2015-07-08 4 views
14

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

  • Массив
  • ContiguousArray
  • ArraySlice

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

+0

проверка http://ankit.im/swift/2016/01/08/exploring-swift-array-implementation/ для деталей – user3441734

ответ

8

От docs:

ContiguousArray:

Эффективность эквивалентна Array, если Т не является классом или @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.

1

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

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

var myArray = Array<Int>() 

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

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

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

Read more.

1

Хороший источник на другой класс Swift является: http://swiftdoc.org/

Массив очень ясно, так что позволяет говорить о двух других.

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

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

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

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

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

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

Вкратце:

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

+0

Мы можем бросить ArraySlice в массив, это возможно с прилежащей массива .. И как использовать это и когда? –

1

Существует новый документ от Apple. https://git.io/vg5uw

Так,

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

.

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

Смежные вопросы