はじめに
Swiftで便利な配列処理の一つスライス処理をした際の
少し特殊なArraySlice型についてまとめました。
前提知識(スライス)
- 配列の一部だけ切り取りたい場合、Swiftでは以下のようにスライス処理が簡単に行えます。
let sortedArray = ["a","b","c","d","e","f"]
let slicedArray = sortedArray[2...3]
//["c", "d"]
- エラー回避のために配列の要素が4以上の時のみ処理するようにした場合
let sortedArray = ["a","b","c","d","e","f"]
let countInt = sortedArray.count //4
//要素が4以上で処理
if countInt >= 4{
let slicedArray = sortedArray[2...3]
}
//["c", "d"]
- ここまでの処理では問題にならないですが、次の記述ではArraySlice型を知っていないといけません。
事前に宣言した場合(エラー)
let sortedArray = ["a","b","c","d","e","f"]
let countInt = sortedArray.count
var slicedArray = [String]() //エラー
//Cannot assign value of type 'ArraySlice<String>' to type '[String]'
if countInt >= 0{
slicedArray = sortedArray[2...3]
}
//["c", "d"]
- Swiftでは配列をスライスするとArraySlice型になるので型が違いますよとエラーが発生します。
ArraySlice型で宣言すべし
let sortedArray = ["a","b","c","d","e","f"]
let countInt = sortedArray.count
var slicedArray = ArraySlice<String>()
if countInt >= 0{
slicedArray = sortedArray[2...3]
}
//["c", "d"]
ArraySlice型の特徴: Indexはオリジナルの配列が基準
sliceArrayからインデックスを取得した場合
//"c"が最初に現れるIndexを取得
let firstIndex:Int? = slicedArray.firstIndex{ $0 == "c" } ?? nil
print(slicedArray)
print(firstIndex as Any)
//["c", "d"]
//Optional(2)
- 取得されたindex番号はsliceArray基準ではなく、
スライスする前の元配列が基準になります。
// スライス前の配列
let sortedArray = ["a","b","c","d","e","f"]
以上、ArraySlice型についてでした。
ご指摘や補足などありましたらコメントにてお願いいたします。