17546


現在Swiftにて、写真フォルダ内のアルバム名の一覧を取得しようとしています。  
ただうまくいかず、ご教授いただきたく、ご質問させていただきました。

下記のコードだと、`album.localizedTitle`に

[code]

    Argument type 'String?!' does not conform to expected type 'AnyObject'
    
[/code]

というエラーが表示されてしまいます。

[code]

    class readPhotoAlbum {
    
        static var albumList: NSMutableArray!
    
        static func createAlbumList(){
    
            let list = PHAssetCollection.fetchAssetCollectionsWithType(PHAssetCollectionType.Album, subtype: PHAssetCollectionSubtype.Any, options:nil)
    
            list.enumerateObjectsUsingBlock { (album, index, isStop) -> Void in
                albumList.addObject(album.localizedTitle)
            }
        }
    }
    
[/code]

下記のように`album.localizedTitle!!`とするとそのエラーは表示されなくなりますが、  
ビルド途中で

[code]

    fatal error: unexpectedly found nil while unwrapping an Optical value
    
[/code]

というメッセージと共に落ちてしまいます。  
breakpointを設定してみてみると`albumList.addObject(album.localizedTitle!!)`の行で止まってしまっているようです。

[code]

    class readPhotoAlbum {
    
        static var albumList: NSMutableArray!
    
        static func createAlbumList(){
    
            let list = PHAssetCollection.fetchAssetCollectionsWithType(PHAssetCollectionType.Album, subtype: PHAssetCollectionSubtype.Any, options:nil)
    
            list.enumerateObjectsUsingBlock { (album, index, isStop) -> Void in
                albumList.addObject(album.localizedTitle!!)
            }
        }
    }
    
[/code]

なお、私の環境はXcode 7.0.1,端末はiOS9.0.2になります。

ちなみに、上記のコードを書く際に参考にさせていただいているのは、[このページ](https://sites.google.com/a/gclue.jp/swift-
docs/ni-yinki100-ios/4-photokit/003-arubamuwo-jian-suosuru)です。

よろしくお願い致します。

※追記  
kishikawaさん、Harawoさんのコメントを参考に、  
下記に修正したところ、無事アルバム名の取得をすることができました。  
ありがとうございます。

[code]

    class readPhotoAlbum {
    
        static var albumList = NSMutableArray()
    
        static func createAlbumList(){
    
            let list = PHAssetCollection.fetchAssetCollectionsWithType(PHAssetCollectionType.Album, subtype: PHAssetCollectionSubtype.Any, options:nil)
    
            list.enumerateObjectsUsingBlock { (album, index, isStop) -> Void in
                if let album = album as? PHCollection { // PHCollectionにキャスト
                    if let localizedTitle = album.localizedTitle { // localizedTitleはnilの可能性がある
                        albumList.addObject(localizedTitle)
                    }
                }
            }
        }
    }
    
[/code]


CC BY-SA 3.0
2015-10-11T17:23:20.173
17539
2015-10-12T07:44:27.663
2015-10-12T07:22:51.887
12734
12734
question
ios swift xcode
写真のアルバム名の一覧を取得ができない

[code]

    static var albumList: NSMutableArray!
    
[/code]

このプロパティ`albumList`の宣言ですと、初期値は`nil`になるので、`addObject()`メソッドを送ると、エラーが発生します。

[code]

    static var albumList = NSMutableArray()
    
[/code]

このように宣言とともに要素が空の`NSMutableArray`を生成するといいでしょう。


CC BY-SA 3.0
2015-10-12T05:45:06.180
17544
2015-10-12T07:44:27.663
2015-10-12T07:44:27.663
7362
7362
17539
answer


まず`Argument type 'String?!' does not conform to expected type
'AnyObject'`というエラーについてですが、`enumerateObjectsUsingBlock()`メソッドの引数は`AnyObject,
Int,
UnsafeMutablePointer<ObjCBool>`なので、`album`オブジェクトの型は`AnyObject`として渡されます。そのため、アルバムのオブジェクトとして扱うためにはその型`PHCollection`にキャストする必要があります。

そして、`localizedTitle`は`nil`の可能性があるので、例えばOptional
Bindingなどを使って`nil`ではないことを保証してから使う必要があります。

[code]

    list.enumerateObjectsUsingBlock { (album, index, isStop) -> Void in
        if let album = album as? PHCollection { // PHCollectionにキャスト
            if let localizedTitle = album.localizedTitle { // localizedTitleはnilの可能性がある
                albumList.addObject(album.localizedTitle)
            }
        }
    }
    
[/code]


CC BY-SA 3.0
2015-10-12T06:08:59.463
17546
2015-10-12T06:08:59.463
5519
17539
answer