在我的应用程序的上传部分工作,从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在传递给函数时复制它自己。
有两个解决方案:
-
将结构体更改为class
-
在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 }
}