尝试将变量集更改为 var,但无法在其存在的结构中更改它



在我的应用程序的上传部分工作,从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
}
}

我声明并创建我的XFile结构从我的uiviewcontroller中:

class UploadFile : UIViewController, URLSessionDelegate {
var xFile : XFile?
//buttonAction
xFile = XFile(fileUrl: url, key: "filename")
}

当我试图改变xFile。fileStage从XFile本身,或在uiviewcontroller中创建XFile的实例,我没有问题。

但是,如果我将xFile作为参数传递给另一个类的函数,则不能更改变量xFile。

:

不能赋值属性:'xFile'是一个'let'常量

但是,如果我将xFile作为xFile的引用发送到第三类,我不会得到错误。

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

这是正常行为吗?
是否在函数中传递xFile发送副本?
我只是想确保我理解并正确使用它。

这是正常行为吗?

可以,因为传递给swift函数的所有形参都是常量。你不能改变他们。如果需要,那么将参数传递为inout。下面是一个例子。

func doubleInPlace(number: inout Int) {
number *= 2
}
var myNum = 10 
doubleInPlace(number: &myNum)
print(myNum) // value is 20

是否在函数中传递xFile发送副本?

是,因为struct实例是值类型。当作为参数传递给函数时,它将发送一个副本。你可以检查一下。

这是因为您使用的是struct而不是class。Struct在传递给函数时复制它自己。

有两个解决方案:

  1. 将结构体更改为class

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

    struct XFile {let键:String让文件名:字符串let data:数据var mimeType:字符串?let url: urlvar 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
    }
    

    }

最新更新