目前我正在处理一个初始化多维数组的类:

class Manager {

    var data: Dictionary<String,NSDictionary>

    init(data: Dictionary<String,NSDictionary>) {

        func getApiData() {

            getApiDataResource() { responseObject, error in

                let resourceA = responseObject!

                self.data["resources"] = resourceA

            }

        }

    }

}

异步返回的responseObject具有以下结构:
{
    "data": [
        {
            id: 1
            name: "Name1"
        },
        {
            id: 2
            name: "Name2"
        }
    ],
    "count": 2,
    "success": true
}

我要在“数据”变量中获取的结构:
{
    "resources": [
        {
            "resourceA":
                {
                    "data": [
                        {
                            id: 1
                            name: "Name1"
                        },
                        {
                            id: 2
                            name: "Name2"
                        }
                    ],
                    "count": 2,
                    "success": true
                }
        },
        {
            "resourceB": // and so on ...
        }
    ]
}

但当将responseObject保存到“data”变量中时:
self.data["resources"] = resourceAData // this line fails

它打印:
Cannot assign to the result of this expression

有人能帮我解决这个问题吗??
谢谢和问候!

最佳答案

我假设有一个函数定义如下:

func getApiDataResource(callback: (responseObject:NSDictionary?, error:NSError?) -> ()) {
    // data retrieved from server at warp 8 here and other futuristic things
}

步骤1(必需)
我把函数getApiData移到了init之外。
class Manager {
    var data: Dictionary<String,NSDictionary>
    init(data: Dictionary<String,NSDictionary>) {
        getApiData()
    }
    func getApiData() {
        getApiDataResource() { responseObject, error in
            let resourceA = responseObject!
            self.data["resources"] = resourceA
        }
    }
}

现在编译器正在抱怨:
在初始化所有存储属性之前在方法调用中使用self
还有这个
从初始值设定项返回而不初始化所有存储的属性
(如你在评论中所述)
好的。我们把它修好。
步骤2(必需)
class Manager {

    var data: Dictionary<String,NSDictionary>

    init(data: Dictionary<String,NSDictionary>) {
        self.data = data
        getApiData()
    }

    func getApiData() {
        getApiDataResource() { responseObject, error in
            let resourceA = responseObject!
            self.data["resources"] = resourceA
        }
    }
}

现在它确实可以正确编译了。
不过,我会调整一些其他的事情。
步骤3(建议)
在后面的闭包中,您正在使用getApiData。你应该尽量避免这样。您没有检查可能不是nil的!参数。
您应该使用error这是conditional unwrapping的安全替代方案(您使用force unwrap)。
class Manager {

    var data: Dictionary<String,NSDictionary>

    init(data: Dictionary<String,NSDictionary>) {
        self.data = data
        getApiData()
    }

    func getApiData() {
        getApiDataResource() { responseObject, error in
            if let resourceA = responseObject where error == nil {
                self.data["resources"] = resourceA
            }
        }
    }
}

如果闭包中的!responseObject,则代码不会崩溃。
步骤4(只是一个偏好)
这只是一种风格偏好。
Swift允许你这样定义字典(就像你那样)。
Dictionary<String,NSDictionary>

或者这样:
[String:NSDictionary]

2语句是等价的。我觉得第二个更重要。所以。。。
class Manager {

    var data: [String:NSDictionary]

    init(data: [String:NSDictionary]) {
        self.data = data
        getApiData()
    }

    private func getApiData() {
        getApiDataResource() { responseObject, error in
            if let resourceA = responseObject where error == nil {
                self.data["resources"] = resourceA
            }
        }
    }
}

让我知道这是你需要的!

关于arrays - Swift-NSDictionary多维,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31732646/

10-11 03:24