swift 不能对类型的不可变值使用mutating成员

guz6ccqo  于 2022-11-21  发布在  Swift
关注(0)|答案(6)|浏览(127)

我有下面的结构:

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' .为什么会这样,我该如何解决这个问题?

tcbh2hod

tcbh2hod1#

将类型转换应用于值类型(如结构)时,如果成功,则会收到所请求值的不可变 * 副本 *:

(self.data as! ModelOne) // this is copy of data

唯一的方法(据我所知)如何你可以变异的值,需要铸造-重新分配值(如@Sahil Beri指出,你需要声明变量):

func someFunc() {
    if var data = data as? ModelOne {
        data.setSub(ModelOne.SubModelOne(someVar: 2, otherVar: 1))
        self.data = data // you can do this since ModelOne conforms to SuperModel
    }
}
bakd9h0s

bakd9h0s2#

像这样使用,

struct UserAttributes {
    var name:String?
    var organizationID:String?
    var email:String?
    
    mutating func parseUserAttributes(attribues:[AWSCognitoIdentityProviderAttributeType])->UserAttributes{
        
        for type in attribues{
            if type.name == "name"{
                name = type.value
            }else if(type.name == "family_name"){
                organizationID = type.value
            }else if(type.name == "custom:role_id"){
                role = type.value
            }else if(type.name == "email"){
                email = type.value
            }
        }
    }
}

在其他类似的文件调用中,

var userAttributes = UserAttributes()
userAttributes = userAttributes.parseUserAttributes(attribues:attributes)
ukqbszuj

ukqbszuj3#

问题是您将data声明为SuperModel,但将其分配为ModelOne。将data声明为ModelOne。然后问题就消失了。

final class SomeClass: SuperClass {
    var data: ModelOne
    init() {
        self.data = ModelOne()
    }
    func someFunc() {
        (self.data).setSub(ModelOne.SubModelOne(someVar: 2, otherVar: 1))
    }
}
t9eec4r0

t9eec4r04#

首先将www.example.com向下转换self.data为ModelOne,然后调用setSub函数

if var data = self.data as? ModelOne {
   data.setSub(ModelOne.SubModelOne(someVar: 2, othervar: 1))
 }
gtlvzcf8

gtlvzcf85#

@Shadow of是对的。你试图改变一个临时结构,这是不可能的,而且大多数时候都是无用的,因为一旦改变完成,它就会被释放。事实上,这和试图修改函数的返回结构是一个类似的问题。(请看这里的答案:(第10页)

6yt4nkrj

6yt4nkrj6#

在Swift 3中,我只需将struct更改为class对象就可以解决这个错误。

相关问题