尝试更改设置为 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。
通过函数传递结构时,结构会复制自身。
有两种解决方案:
要么将结构更改为 class。
在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
}
}
在我的应用程序的上传部分,从 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。 通过函数传递结构时,结构会复制自身。
有两种解决方案:
要么将结构更改为 class。
在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 }
}