不能对不可变值使用变异成员:“父”是“让”常量? [关闭]

Posted

技术标签:

【中文标题】不能对不可变值使用变异成员:“父”是“让”常量? [关闭]【英文标题】:Cannot use mutating member on immutable value: 'parent' is a 'let' constant? [closed] 【发布时间】:2021-02-23 05:10:20 【问题描述】:
import UIKit
import SwiftUI

var str = "Hello, playground"

struct FianceItem: Identifiable,Codable 
    
    public var id: UUID
    public var type: String
    public var order: Int32
    public var parentID: UUID?
    public var childs:[FianceItem]
    
    static func createType(name: String, parent: FianceItem?) -> FianceItem 
        var item = FianceItem(id: UUID(), type:name, order: 1, parentID: nil,childs: [])
        
        if parent != nil 
            item.parentID=parent!.id
            
            //Error Cannot use mutating member on immutable value: 'parent' is a 'let' constant
            parent?.childs.append(item)
        
        return item
    
    



var root = FianceItem.createType(name: "MyRoot", parent: nil)
var child = FianceItem.createType(name: "child", parent: root)

【问题讨论】:

问题是……? 似乎父中的子数组被声明为let变量。这意味着数组是不可变的,你不能修改它们的值。如果将 parent 的 childs 变量声明为 var 而不是 let,则应该能够将更多元素添加到数组中。 虽然对于错误,我看到父级不可变。似乎您将其声明为 let,而不是 var。这些关键字定义了变量的可变性。 【参考方案1】:

当您传递一个结构(按值复制)时,如果没有inout,您将无法改变函数参数。

编辑你的代码,然后再试一次:

static func createType(name: String, parent: inout FianceItem?) -> FianceItem 

如果你想通过 nils,你也必须做这个改变:

var nilParent: FianceItem? = nil
var root = FianceItem.createType(name: "MyRoot", parent:&nilParent)

【讨论】:

您不能将 nil 值传递给父级。 你可以,但工作量更大。我将编辑我的答案。

以上是关于不能对不可变值使用变异成员:“父”是“让”常量? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 试图从列表中删除对象但无法在不可变值上使用变异成员:是一个“让”常量

不能对不可变值使用变异 getter:'self' 是不可变错误

从子视图中更改视图中的数组“不能在不可变值上使用变异成员:'self' 是不可变的”

Swift 2在协议扩展中使用变异函数时出错“无法在不可变值上使用变异成员:'self'是不可变的

如何使swiftui结构可变

SwiftUI List -> ForEach -> Item 是一个让,所以我不能改变一个值