尝试更改设置为 var 的变量,但无法在它存在的结构中更改它

Trying to change a variable set as var, but can't change it within the structure it exists

在我的应用程序的上传部分,从 iPhone 上传文件后,服​​务器将文件置于多个处理阶段。

我使用一个结构来保存上传的文件信息、要调用的脚本等

struct XFile {
    let key: String
    let filename: String
    let data: Data
    var mimeType: String?
    let url: URL
    var toUrl : URL?
    var upStatus : UpStatus?
    var fileStage : Int32?
    
    init(fileUrl: URL, key: String) {
        //setting multiplle variables here
        //set the initial fileStage to 0
        self.fileStage = 0
    }
}

我在我的 UIViewControler 中声明并创建我的 XFile 结构:

class UploadFile : UIViewController, URLSessionDelegate {
    var xFile : XFile?

    //buttonAction
    xFile = XFile(fileUrl: url, key: "filename")
}

当我尝试从 XFile 本身或创建该 XFile 实例的 UIViewControler 中更改 xFile.fileStage 时,我没有遇到任何问题。

但是,如果我将 xFile 作为参数传递给另一个 class 的函数,我无法在没有获得以下编译器编辑器的情况下更改变量 xfile.fileStage:

Cannot assign to property: 'xFile' is a 'let' constant

但是,如果我将 xFile 作为对 xFile 的引用发送给第 3 个 class。

getService.start(upFile: &xFile!, upLoadInvoiceClass: self)

这是正常行为吗?
是不是在函数中传递xFile就发送了一份?
我只是想确保我理解并正确使用它。

Is this normal behavior?

是的,因为传递给 swift 函数的所有参数都是常量。你无法改变它们。如果需要,则将参数作为 inout 传递。这是一个例子。

func doubleInPlace(number: inout Int) {
    number *= 2
}

var myNum = 10 
doubleInPlace(number: &myNum)
print(myNum) // value is 20

Is it that passing xFile in a function sends a copy?

是的,因为 struct 实例是值类型。当在函数中作为参数传递时,它将发送一个副本。您可以查看 this.

这是因为您使用的结构不是 class。 通过函数传递结构时,结构会复制自身。

有两种解决方案:

  1. 要么将结构更改为 class。

  2. 在struct中创建一个可以改变fileStage的变异方法

    结构 XFile { 让键:字符串 让文件名:字符串 让数据:数据 var mimeType:字符串? 让 url: URL var toUrl:URL? var upStatus : UpStatus? var fileStage : Int32?

    init(fileUrl: URL, key: String) {
        //setting multiplle variables here
        //set the initial fileStage to 0
        self.fileStage = 0
    }
    
    mutating func updateFileStage(_ stage: Int32) {
        self.fileStage = stage
    }
    

    }