『Advanced Swift』ノート4:スライス(Slice)
1369 ワード
原文リンク:『Advanced Swift』ノート4:スライス(Slice)
スライス(Slice)は、任意の集合タイプ(CollectionTypeに準拠するタイプ)に基づいた軽量レベルのパッケージであり、デフォルトでは元の集合に対するパッケージを返し、インデックスのサブレンジを加えるので、メモリサイズが元より大きくなります.また、Swiftの配列や文字列を含む多くのスライス可能なコンテナは、スライスと元の集合がストレージキャッシュを共有しており、元の集合が役割ドメインを離れてもスライスが元の集合のキャッシュを保持し、メモリの問題を引き起こす可能性があります.
With many sliceable containers, including Swift’s arrays and strings, a slice shares the storage buffer of the original collection. This has an unpleasant side effect: slices can keep the original collection’s buffer alive in its entirety, even if the original collection falls out of scope. If you read a 1 GB file into an array or string, and then slice off a tiny part, the whole 1 GB buffer will stay in memory until both the collection and the slice are destroyed.
また、スライスがインデックス範囲を変更しているため、インデックスが0から始まるのではなく、startIndexから始まるのではないかとデフォルト化することはできません.これも、Swiftではfor inループを用い、Cスタイルのforループを破棄すべき理由の一つです.
スライス(Slice)は、任意の集合タイプ(CollectionTypeに準拠するタイプ)に基づいた軽量レベルのパッケージであり、デフォルトでは元の集合に対するパッケージを返し、インデックスのサブレンジを加えるので、メモリサイズが元より大きくなります.また、Swiftの配列や文字列を含む多くのスライス可能なコンテナは、スライスと元の集合がストレージキャッシュを共有しており、元の集合が役割ドメインを離れてもスライスが元の集合のキャッシュを保持し、メモリの問題を引き起こす可能性があります.
With many sliceable containers, including Swift’s arrays and strings, a slice shares the storage buffer of the original collection. This has an unpleasant side effect: slices can keep the original collection’s buffer alive in its entirety, even if the original collection falls out of scope. If you read a 1 GB file into an array or string, and then slice off a tiny part, the whole 1 GB buffer will stay in memory until both the collection and the slice are destroyed.
また、スライスがインデックス範囲を変更しているため、インデックスが0から始まるのではなく、startIndexから始まるのではないかとデフォルト化することはできません.これも、Swiftではfor inループを用い、Cスタイルのforループを破棄すべき理由の一つです.
let array = [1, 4, 5, 2, 11, 34, 33, 88, 43]
let subArray = array.suffixFrom(4)
// subArray , startIndex endIndex。
subArray.startIndex // 4
subArray.endIndex // 9
// subArray
sizeofValue(array) // 8
sizeofValue(subArray) // 32
// subArray ,
// , 。
// :
subArray[subArray.startIndex.advancedBy(0)]
subArray[0] // , subArray.startIndex 4,0 。
subArray.count
// Swift C for , for in 。
for int in subArray {
print(int)
}