代码之家  ›  专栏  ›  技术社区  ›  Creative crypter

Swift-NSDictionary多维

  •  0
  • Creative crypter  · 技术社区  · 10 年前

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

    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保存到“数据”变量中时:

    self.data["resources"] = resourceAData // this line fails
    

    它打印:

    Cannot assign to the result of this expression
    

    有人能帮我解决这个问题吗??

    谢谢和问候!

    2 回复  |  直到 10 年前
        1
  •  2
  •   Luca Angeletti    10 年前

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

    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 方法调用中 获取ApiData 在初始化所有存储属性之前

    还有这个

    从初始值设定项返回而不初始化所有存储的属性 (如您在评论中所述) 好的让我们来解决它。

    步骤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(建议)

    在尾部封口内,您正在使用 ! 。你应该尽可能避免这种情况。你没有检查 error 参数不能为nil。

    你应该使用 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 关闭时 nil .

    步骤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
                }
            }
        }
    }
    

    让我知道这是你需要的!

        2
  •  0
  •   Knight0fDragon    10 年前

    你有 let data: Dictionary<String, Array<String>> ,应为 var data: Dictionary<String, Array<String>>

    推荐文章