在打开Optional值时意外发现nil

时间:2014-08-19 23:50:27

标签: swift

可能我不明白可选值:

class func albumsWithJSON(allResults: NSArray) -> [Album] {
    var albums = [Album]()
    if allResults.count>0 {
        for result in allResults {
            var name = result["trackName"] as? String
            if name == nil {
                name = result["collectionName"] as? String
            }

            var price = result["formattedPrice"] as? String
            if price == nil {
                price = result["collectionPrice"] as? String
                if price == nil {
                    var priceFloat: Float? = result["collectionPrice"] as? Float
                    var nf: NSNumberFormatter = NSNumberFormatter()
                    nf.maximumFractionDigits = 2;
                    if priceFloat != nil {
                        price = "$"+nf.stringFromNumber(priceFloat)
                    }
                }
            }

            let thumbnailURL = result["artworkUrl60"] as String
            let imageURL = result["artworkUrl100"] as String
            let artistURL = result["artistViewUrl"] as? String

            var itemURL = result["collectionViewUrl"] as? String
            if itemURL == nil {
                itemURL = result["trackViewUrl"] as? String
            }

            var newAlbum = Album(name: name!, price: price!, thumbnailImageURL: thumbnailURL, largeImageURL: imageURL, itemURL: itemURL!, artistURL: artistURL!)
            albums.append(newAlbum)
        }
    }
}

在这一行,我得到“在解开一个Optional值时意外发现nil”错误:

var newAlbum = Album(name: name!, price: price!, thumbnailImageURL: thumbnailURL, largeImageURL: imageURL, itemURL: itemURL!, artistURL: artistURL!)

显然JSON缺少一些信息,但是如何处理缺失值呢?

1 个答案:

答案 0 :(得分:2)

所有错误意味着您传递给该函数的值之一是nil。当您将!放在这些值的末尾时,它会将其展开。如果在展开时值为nil,则会抛出异常。

解决此问题的方法取决于nil值的重要性。如果你不能使用nil中的任何一个,那么你必须检查nil并做一些事情。如果你可以将它们设为零,那么你需要确保该函数接受nil值。

为了更好地理解选项,您应该阅读文档:https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5-XID_483