6301


Swiftで下記のコードのようにNSValueTransformerを使って値を変換しようとしています。

[code]

    @objc (ImageTransformer)
    class ImageTransformer: NSValueTransformer {
        override func transformedValue(value: AnyObject!) -> AnyObject? {
            let tweets = value as? Array<Tweet>;
            return tweets.map { (tweet: Tweet) -> Tweet in
                // 処理
            };
        }
    }
    
[/code]

このとき、AnyObjectをArrayにキャストして処理したいのですが、

[code]

    'Array<Tweet>' is not a subtype of 'Tweet'
    
[/code]

とエラーが出てしまいます。  
`Array<Tweet>`を`map`で処理しているので、引数には`Tweet`が入って来ると思っているのですが違うのでしょうか。  
AnyObjectをキャストしてmapで処理する方法を教えてください。


CC BY-SA 3.0
2015-02-11T06:32:29.290
6299
2015-02-11T07:00:10.823
7737
question
swift
AnyObjectで受け取った配列をキャストしてmapで処理する方法について


`let tweets = value as? Array<Tweet>` を `if let tweets = value as?
Array<Tweet>` にする以下の実装でエラーが起きないことを確認しました。

[code]

    class ImageTransformer: NSValueTransformer {
        override func transformedValue(value: AnyObject!) -> AnyObject? {
            if let tweets = value as? Array<Tweet> {
                return tweets.map{ (tweet: Tweet) -> Tweet in
                    // 処理
                    return tweet
                };
            }
            return nil
        }
    }
    
[/code]

`AnyObject!` を `value as? Array<Tweet>` するところで `nil`
が帰ってくる可能性があるために、コンパイラがエラーを吐いているのではと思っています。  
再現のための最小コードは以下となります。

[code]

    let tweets:Array<Tweet>? = nil
    tweets.map{(tweet: Tweet) -> Tweet in
        // 処理
        return tweet
    }
    
[/code]


CC BY-SA 3.0
2015-02-11T07:00:10.823
6301
2015-02-11T07:00:10.823
5106
6299
answer