24461


日本語の情報が少なく、がんばってリファレンスを読んだのですが、まだ理解できていないので伺います。

リファレンスをざっと読んだ感じだと、  
ArraySliceはArray同様に振る舞うとあり、Obj-Cとの互換性がないとありました。  
(英語が苦手のため誤った解釈かもしれません、間違っていたらご指摘ください。)

そして、ArraySliceは長期的なインスタンスの保管は、推奨されておらず、  
一時的な処理にのみ利用すると書いてありました。

でしたら、わざわざArraySliceを用いる必要がないような？と思ったため調べました。  
ArraySliceの正体やどのようなときに使用するのかを知りたいです。

そもそもArraySliceって何？となったのは  
<http://tercel-tech.hatenablog.com/entry/2014/08/18/211514>  
こちらのブログで掲載されている以下のコードを見てのことです

[code]

    public subscript(range: Range<Int>) -> ArraySlice<Book> {
        get { return books[range] }
        set { books[range] = newValue }
    }
    
[/code]

ブログでは戻り値がSliceだったのですが、Swift2.3ではエラーがでたのでArraySliceに変更になったのかな？と思って書き直しています。

なぜここでArraySliceを使うのかも教えていただければ助かります。


CC BY-SA 3.0
2016-04-29T08:38:08.543
24450
2016-04-29T14:46:05.207
13404
question
swift swift2
ArraySliceについて詳しく知りたい。


リンク先のコード例は、Swift1.2時代のものなので、根本的にいろいろ変わってしまいました。

`CollectionType`に準拠したクラスを作るというだけであれば以下の記述でいけると思います。（もっとスマートな書き方があるのかもしれません）

[code]

    class BookShelf: CollectionType {
        private var books:[Book] = []
    
        var startIndex: Int = 0
        var endIndex: Int {
            get{
                return self.books.count
            }
        }
    
        subscript (index: Int) -> Book {
            return self.books[index]
        }
    
        func append(book: Book) {
            self.books.append(book)
        }
    }
    
[/code]

`Slice`が出てこないのは、`Range<Self.Index>`を引数に取り、`Slice<Self>`を返す`subscript()`が、`Default
Implementation`（プロトコルエクステンションによって標準の挙動が実装されている）になったためです。

* * *

では`ArraySlice`とは何だったのかというと、単純に部分配列を表す構造体です。

[code]

    let array = [1, 2, 3, 4]
    let slice = array[0...2]
    print(slice.dynamicType) // ArraySlice<Int>
    
[/code]

例えばこのような部分配列を作った場合、`ArraySlice<Int>`型になります。

[code]

    _bridgeToObjectiveC(array) // [1, 2, 3, 4, 5]
    _bridgeToObjectiveC(range) // nil
    
[/code]

宣言部分だけを見ればほぼ`Array`と同じなのが分かります。

  * メモリ上に連続して配置される特性がある
  * `Array`が持っている （たとえばObjective-Cとの互換のための） 拡張がない

という特徴から、ドキュメントにあるように一時的な軽量な処理において扱うためにあるのだと思います。


CC BY-SA 3.0
2016-04-29T14:46:05.207
24461
2016-04-29T14:46:05.207
5337
24450
answer