[英]Swift Cannot assign through subscript: 'peerDeviceSettings' is a get-only property"
I have this declaration in my class: 我班上有这样的声明:
var peerDevice: [String: Any]?
private var peerDeviceSettings:[String:Any]? {
get {
if let settings = peerDevice?["settings"] as? [String:Any] {
return settings
}
return nil
}
}
Now the problem is if I wish to change peerDeviceSettings, such as this: 现在的问题是,如果我想更改peerDeviceSettings,例如:
fileprivate func set(_ value: Any?, forKey key: Key) {
if peerDeviceSettings != nil {
peerDeviceSettings?[key.rawValue] = value
}
}
I get an error 我得到一个错误
Cannot assign through subscript: 'peerDeviceSettings' is a get-only property
The point is how do I rearchitect this thing without creating a new mutable variable peerDeviceSettings? 关键是如何在不创建新的可变变量peerDeviceSettings的情况下重新构造此东西?
Just add set (setter)
to the property and handle it there. 只需将set (setter)
添加到属性中并在那里进行处理。
private var peerDeviceSettings:[String:Any]? {
get {
if let settings = peerDevice?["settings"] as? [String:Any] {
return settings
}
return nil
}
set {
}
}
your code seems to be fine, since you're creating links to the nested settings
dictionary (sounds reasonably) 您的代码似乎很好,因为您正在创建到嵌套settings
字典的链接(听起来合理)
just add setter: 只需添加二传手:
private var peerDeviceSettings: [String: Any]? {
get {
if let settings = peerDevice?["settings"] as? [String:Any] {
return settings
}
return nil
}
set {
if peerDevice == nil {
peerDevice = [:] // if it's desired behavior
}
peerDevice?["settings"] = newValue
}
}
I'd also suggest getting rid of optionality in peerDevice
, just initialize it with empty value (if it feets your logic) 我还建议摆脱peerDevice
的可选peerDevice
,只需将其初始化为空值(如果它符合您的逻辑)
You see this error because you declared only getter for your property, you have also add setter 您看到此错误是因为您仅声明了属性的getter,还添加了setter
private var peerDeviceSettings:[String:Any]? {
get {
if let settings = peerDevice?["settings"] as? [String:Any] {
return settings
}
return nil
}
set {
peerDevice?["settings"] = newValue
}
}
UPDATE: to show how it must be in this certain case 更新:显示在特定情况下的情况
You need a setter 你需要二传手
private var peerDeviceSettings:[String:Any]? {
get {
return peerDevice?["settings"] as? [String:Any]
}
set {
peerDevice?["settings"] = newValue
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.