我有下面的结构:
public protocol SuperModel {
// empty protocol
}
struct ModelOne: SuperModel {
struct SubModelOne {
var someVar: Double
var othervar: Double?
}
var sub: SubModelOne?
mutating func setSub(sub: SubModelOne) {
self.sub = sub
}
}
在我的类中,我想这样使用这个结构体:
final class SomeClass: SuperClass {
var data: SuperModel
init() {
self.data = ModelOne()
}
func someFunc() {
(self.data as! ModelOne).setSub(ModelOne.SubModelOne(someVar: 2, otherVar: 1))
}
}
我收到以下错误:Cannot use mutating member on immutable value of type 'ModelOne'
.为什么会这样,我该如何解决这个问题?
6条答案
按热度按时间tcbh2hod1#
将类型转换应用于值类型(如结构)时,如果成功,则会收到所请求值的不可变 * 副本 *:
唯一的方法(据我所知)如何你可以变异的值,需要铸造-重新分配值(如@Sahil Beri指出,你需要声明变量):
bakd9h0s2#
像这样使用,
在其他类似的文件调用中,
ukqbszuj3#
问题是您将
data
声明为SuperModel
,但将其分配为ModelOne
。将data
声明为ModelOne
。然后问题就消失了。t9eec4r04#
首先将www.example.com向下转换self.data为ModelOne,然后调用setSub函数
gtlvzcf85#
@Shadow of是对的。你试图改变一个临时结构,这是不可能的,而且大多数时候都是无用的,因为一旦改变完成,它就会被释放。事实上,这和试图修改函数的返回结构是一个类似的问题。(请看这里的答案:(第10页)
6yt4nkrj6#
在Swift 3中,我只需将
struct
更改为class
对象就可以解决这个错误。