28859


参考書を見てアプリを作っている途中で

[code]

    var todo = [String]()
    var songs = Array<MPMediaItem>() 
    
[/code]

この二つの文が出てきました。  
しかし、どちらも何を表しているのかわかりません。

しかし、プログラムを見る限り  
どちらの文も配列として扱われていると思います。

これは、構造体が配列に入っているとみてよいのでしょうか？


CC BY-SA 3.0
2016-09-13T07:18:13.483
28854
2016-09-13T10:29:09.717
2016-09-13T07:26:34.507
18539
18539
question
swift array
構造体の配列の表記法


`[T]`と`Array<T>`は、基本的に全く同じ意味で、前者は後者の省略記法であると思ってください。したがって、Swiftの配列型にどんなメソッドが使えるかを調べるときは`Array`が正式の型名であると考えて調べることになります。

`Array<T>`という書き方は、Swiftのジェネリクスと呼ばれるもので、別のデータ型を型パラメータとして持つデータ型が宣言できます。一般的な話を突っ込んでやるとややこしくなりすぎるのですが、`Array`型の場合には、`<T>`の部分で要素(`Element`)の型を指定するのだと思ってください。

`var todo = [String]()`は、`var todo =
Array<String>()`と書くのと全く同じで、`String`型の要素を持つ配列をデフォルトイニシャライザで初期化(`()`の部分…中身が空の配列ができる)し、その結果を初期値として変数`todo`を宣言しています。

`var songs = Array<MPMediaItem>()`の方は、`var songs =
[MPMediaItem]()`と全く同じで、要素型が`MPMediaItem`で中身が空の配列を作り、それを初期値とした変数`songs`を宣言しています。

(Swiftは型にうるさい言語で、配列を作る場合でも宣言時に要素の型を決定しておく必要がありますので、中身が空の配列を作る場合にも要素の型が必要になります。)

Swiftの変数宣言は、

[code]

    var 変数名: データ型 = 初期値
    
[/code]

という形式をしていますが。データ型を省略した場合、その変数のデータ型は初期値から推定されるものになります。したがって、あなたの2つの例は、

[code]

    var todo: [String] = [String]()
    var songs: Array<MPMediaItem> = Array<MPMediaItem>()
    
[/code]

と書いているのと同じことになります。

ちなみにSwiftでは、`String`は構造体(`struct`)ですが、`MPMediaItem`はクラス(`class`)になり両者は厳密に区別されます。まだ漠然としか違いがわかっておられないかもしれませんが、できるだけ早く意味をつかんでもらえないとQ&Aサイトに意味の通じる質問を書くのも難しくなってしまいます。(さらにちなみに`Array`型自体は`struct`の方です。)

ご質問内容に関して説明できていないと思われる点があれば、コメント等でお知らせください。

なお、これからSwiftを学習するのであれば、一度は公式のSwift本を読んでおくことをお勧めします。

[The Swift Programming Language (Swift
3)](https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/index.html#//apple_ref/doc/uid/TP40014097)

中身が英語なのと(以前には日本語化プロジェクトがあったようなのですが…)、他の言語を熟知している人を想定して書かれた部分がやや多いのですが、文法自体は中1程度の平易なものですし、Swiftでプログラミングする上で必要になってくる事柄が豊富なコード例とともに一通り説明されています。


CC BY-SA 3.0
2016-09-13T10:29:09.717
28859
2016-09-13T10:29:09.717
13972
28854
answer