从初始化程序返回而不初始化所有存储的属性错误 - 但所有内容都已初始化

时间:2017-01-11 02:11:06

标签: swift object

我遇到了这个奇怪的错误。它工作正常,直到我添加了image和imageString值,然后发生了这个错误:

  

从初始化程序返回,而不初始化所有存储的属性

我以为我初始化了所有属性,不确定为什么会发生这种错误。这是自定义对象类

class JSONObject {
    private let baseImageURL = "https://website.com"

    var airbnbUS: Int
    var airbnbLocal: Int
    var imageString: String
    var image: URL

    init(airbnbUS: Int, airbnbLocal: Int, imageString: String, image: URL ){

        self.airbnbUS = airbnbUS
        self.airbnbLocal = airbnbLocal
        self.imageString = imageString
        self.image = image
    }

    init(resultsDictionary:[String: Any]){
        guard let cost = resultsDictionary["cost"] as? [String: Any],
            let airbnb = cost["airbnb_median"] as? [String : Any],
            let usd = airbnb["USD"] as? Int,
            let chf = airbnb["CHF"] as? Int
            else {
                airbnbUS = 0
                airbnbLocal = 0
                return
        }

        airbnbUS = usd
        airbnbLocal = chf

        guard let media = (resultsDictionary["media"] as? [String: Any]),
            let imageDictionary = media["image"] as? [String: Any],
            let image1000 = imageDictionary["1000"] as? String
            else {
                imageString = ""
                image = URL(string: "\(baseImageURL)")!
                return
        }
        imageString = image1000
        image = URL(string: "\(baseImageURL)\(imageString)")!
    }
}

1 个答案:

答案 0 :(得分:0)

问题出在您的resultsDictionary初始值设定项中。您的第一个return语句中的guard可能会提前从初始化程序返回,以及以下guard语句(以及您分配imageimageString的代码属性)可能无法执行。

一种解决方案是将第一个guard语句更改为if-let语句。

init(resultsDictionary:[String: Any]){

    if let cost = resultsDictionary["cost"] as? [String: Any],
        let airbnb = cost["airbnb_median"] as? [String : Any],
        let usd = airbnb["USD"] as? Int,
        let chf = airbnb["CHF"] as? Int
        {
            airbnbUS = usd
            airbnbLocal = chf
    } else {
        airbnbUS = 0
        airbnbLocal = 0
    }

    guard let media = (resultsDictionary["media"] as? [String: Any]),
        let imageDictionary = media["image"] as? [String: Any],
        let image1000 = imageDictionary["1000"] as? String
        else {
            imageString = ""
            image = URL(string: "\(baseImageURL)")!
            return
    }
    imageString = image1000
    image = URL(string: "\(baseImageURL)\(imageString)")!
}