【问题标题】:Set new value with computed properties使用计算属性设置新值
【发布时间】:2016-04-15 00:36:39
【问题描述】:

我有一个模型对象,我想为该对象设置新值。

下面我已经提到了对象变量和初始化

private var _data: NSMutableDictionary

// MARK:- Init
init(data: [String: AnyObject])
{
    _data = NSMutableDictionary(dictionary: data)
}

如何使用 setter 设置新值。下面我提到了计算变量

var name: String? {

    get {
        if let nameObject = _data.objectForKey("network")?.objectForKey("name") {
            return (nameObject as! String)
        } else {
            return nil
        }
    }

    set {

    }
}

需要完成setter

编辑

我可以找到这个问题的答案。

我需要更改 _data 对象的名称。所以我必须更新名称而不更改 _data 中的其他变量。所以我保留了 _data 对象的可变副本并在那里更改了新值。然后更新了 _data 对象。

【问题讨论】:

  • 你告诉我们你想要达到什么目标,但你没有告诉我们你遇到了什么问题。

标签: swift nsdictionary computed-properties


【解决方案1】:

这个怎么样:

var name: String? {

    get {
        return _data["network"]?["name"] as? String
    }

    set {
        if let network = _data["network"] as? Dictionary {
            network["name"] = newValue
        } else {
            let network: [String:AnyObject] = ["name": newValue]
            data["network"] = network
        }
    }
}

setter 还负责处理network 键不存在的情况。如果_data 也可以是nil,那么也可以添加一个额外的if-let 来解决这种情况。

顺便说一句,我还添加了一个较短版本的 getter。

【讨论】:

    【解决方案2】:

    不太确定你想在这里做什么,但你不能写这个吗:

    set {
        _data.objectForKey("network")?.objectForKey("name") = newValue
    }
    

    编辑:错误的功能,应该是:

    set {
        _data.objectForKey("network")?.setObject(newValue, forKey: "name")
    }
    

    【讨论】:

    • 我以前试过。它给出了一个错误“无法赋值:函数调用返回不可变值”
    • 这里我正在创建一个模型对象。所以我想写设置选项。根据理论,您的答案似乎是正确的。但我无法理解错误
    【解决方案3】:

    类似

    set {
        _data.objectForKey("network")?.setObject(newValue, forKey: "name")
    }
    

    【讨论】:

    • 它给出了错误“无法识别的选择器发送到实例 0x7fd240dcf180”
    • 那么字典里到底是什么?您需要在该对象上调用适当的 setter 函数。
    猜你喜欢
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 2021-07-09
    • 2012-08-01
    • 2020-06-06
    • 1970-01-01
    相关资源
    最近更新 更多