28967


NSUserDefaultsに格納されている配列の文字列をテーブルビューの複数のセル上のLabelに表示したいのですが、label.textに代入するところで

_Type AnyObject? has no subscript members_

というエラーがでて、ビルドできません。  
オプショナル型のAnyObjectからString型に変換すればよいのだろうか、と推測したものの、具体的な方法が分からず、質問させていただきました。

[code]

    //これだとエラーがでる
    let test = ud.objectForKey("test")
    cell!.label.text = test[indexPath.row]
    
    //こちらだと正常に表示される
    let test = ["A", "B", "C"]
    cell!.label.text = test[indexPath.row]
    
[/code]

よろしくお願いします。


CC BY-SA 3.0
2016-09-18T11:50:27.083
28966
2016-09-18T15:50:13.783
18443
question
swift
NSUserDefaultsから取り出した配列をlabel.textに代入したい


`ud.objectForKey("test")`部ですが、`ud.arrayForKey("test")`ではないですか？  
NSUserDefaultsから値を取り出す際には、`stringForKey`, `arrayForKey`, `dictionaryForKey`,
`boolForKey`等、取り出す型を明示して取り出すメソッドが多数有ります。  
その内の適切な型の`xxxForKey`を使うべきでしょう。

今回は成功例から(文字列の)配列と想像されるので、`ud.objectForKey`ではなく`ud.arrayForKey`を使うべきだと思われます。


CC BY-SA 3.0
2016-09-18T12:06:42.183
28967
2016-09-18T12:06:42.183
14745
28966
answer


> オプショナル型の`AnyObject`から`String`型に変換すればよいのだろうか、と推測したものの、

これは、「オプショナル型の`AnyObject`から`String`型 **を要素とする配列** に変換」という考え方にしなければいけません。  
すでに、メソッド`ud.arrayForKey("test")`を使うことで解決してますが、メソッド`ud.objectForKey("test")`のままでも、正しい結果を導くことができます。

[code]

    if let test = ud.objectForKey("test") as? [String] {
        cell!.label.text = test[indexPath.row]
    }
    
[/code]

このように、`as?`（あるいは`as!`）を使って、適切な型にダウンキャストしてやれば、`objectForKey()`も使えます。


CC BY-SA 3.0
2016-09-18T15:50:13.783
28969
2016-09-18T15:50:13.783
18540
28966
answer