6717


Optional String型のimageURLStringに画像のURLが格納されており、その画像をimageViewで表示したいと考えています。

以下のコードで動作はしますが、ネストが深くなりすぎてしまいます。  
よりシンプルな書き方があれば、ご教示いただけると幸いです。

[code]

    if let imageURLString = imageURLString {
        if let urlString = imageURLString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding) {
            if let url = NSURL(string: urlString) {
                if let data = NSData(contentsOfURL: url, options: .DataReadingMappedIfSafe, error: nil) {
                    if let image = UIImage(data: data) {
                        self.imageView.image = image
                    }
                }
            }
        }
    }
    
[/code]


CC BY-SA 3.0
2015-02-18T08:14:19.687
6691
2015-02-19T01:18:09.170
5710
question
swift
SwiftのOptional Bindingでネストが深くなってしまう


Swift 1.2より、書式が追加になって、より短い記述ができるようになるそうです。

[code]

    if let imageURLString = imageURLString, let urlString = imageURLString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding), let url = NSURL(string: urlString), let image = UIImage(data: data) {
        self.imageView.image = image
    }
    
[/code]

このように、カンマで区切って記述ができるそうです。  
詳しくは、「Swift 1.2」などをキーワードにして、ネット検索してください。  
しばらくのがまん、といったところでしょうか？


CC BY-SA 3.0
2015-02-18T08:41:16.403
6692
2015-02-18T08:41:16.403
7362
6691
answer


こんな感じで多少浅くできました。  
※申し訳ありません、エラーが出ないところまでしか確認していないです。

[code]

    if let imageURLString = imageURLString?.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding) {
        if let url = NSURL(string: imageURLString) {
            if let data = NSData(contentsOfURL: url) {
                view.image = UIImage(data: data) ?? nil
            }
        }
    }
    
[/code]

----- 追記 -----  
少々ネタ的で恐縮ですが

[code]

    func test() {
        let imageURLString: String? = "画像のパス"        
        if let data = imageURLString?.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)?.urlFromString()?.dataFromURL() {
            imageView.image = UIImage(data: data) ?? nil
        }
    }
    
    extension String {
    
        func urlFromString() -> NSURL? {
            return NSURL(string: self)
        }
    }
    
    extension NSURL {
    
        func dataFromURL() -> NSData? {
            return NSData(contentsOfURL: self)
        }
    }
    
[/code]

これで画像表示はできました。


CC BY-SA 3.0
2015-02-18T09:14:38.300
6694
2015-02-18T09:50:30.183
2015-02-18T09:50:30.183
3516
3516
6691
answer


@Harawo様の回答にあるように、Swift1.2からは複数のOptional Bindingを1行で書けるようになります。

[code]

    if let imageURLString = imageURLString, urlString = imageURLString.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding), url = NSURL(string: urlString), data = NSData(contentsOfURL: url, options: .DataReadingMappedIfSafe, error: nil), image = UIImage(data: data) {
        self.imageView.image = image
    }
    
[/code]

回答者様ありがとうございました。


CC BY-SA 3.0
2015-02-19T01:18:09.170
6717
2015-02-19T01:18:09.170
5710
6691
answer