В Swift 2, что основное различие между вариантами три массива:В чем разница между массивом <T>, ContiguousArray <T> и ArraySlice <T> в Swift?
- Массив
- ContiguousArray
- ArraySlice
Может кто-нибудь объяснить это реальный пример?
В Swift 2, что основное различие между вариантами три массива:В чем разница между массивом <T>, ContiguousArray <T> и ArraySlice <T> в Swift?
Может кто-нибудь объяснить это реальный пример?
От 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
.
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, но от его имени можно догадаться, что он должен делать с внутренней памятью массива, вероятно, элементы хранятся в Непрерывная компоновка памяти.
Хороший источник на другой класс 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 является представление массива в суб части.
Мы можем бросить ArraySlice в массив, это возможно с прилежащей массива .. И как использовать это и когда? –
Существует новый документ от Apple. https://git.io/vg5uw
Так,
ContiguousArray<Element>
это самый быстрый и простой из трех использования это, когда вам нужно «массив C» производительность. Элементы ContiguousArray всегда хранятся смежно в памяти.
.
Array<Element>
подобенContiguousArray<Element>
, но оптимизирован для эффективных преобразований из какао и обратно-когда элемент может быть типом класса ,Array<Element>
могут быть поддержаны (потенциально несмежным) хранения произвольной NSArray а чем на Swift ContiguousArray.Array<Element>
также поддерживает переходы между массивами связанных классов.Когда известно, что Элемент является классом типа , производительностьArray<Element>
идентична величине отContiguousArray<Element>
.
проверка http://ankit.im/swift/2016/01/08/exploring-swift-array-implementation/ для деталей – user3441734