Работая над разделом загрузки моего приложения, после загрузки файла с 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 из своего UIViewControler с помощью:
class UploadFile : UIViewController, URLSessionDelegate {
var xFile : XFile?
//buttonAction
xFile = XFile(fileUrl: url, key: "filename")
}
Когда я пытаюсь изменить xFile.fileStage из самого XFile или из UIViewControler, который создал этот экземпляр XFile, у меня не возникает проблем.
Однако, если я передам xFile в качестве параметра функции другого класса, я не смогу изменить переменную xfile.fileStage, не получив следующий редактор компилятора:
Cannot assign to property: 'xFile' is a 'let' constant
Однако я не получаю ошибку, если отправляю xFile в качестве ссылки на xFile этому третьему классу.
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
являются типами значений. Он отправит копию при передаче в качестве параметра функции. Вы можете проверить это.
Это потому, что вы используете структуру, а не класс. Struct создает свою копию, когда вы передаете ее через функции.
Есть два решения:
Либо измените структуру на класс.
Создайте мутирующий метод в структуре, который может изменить fileStage
структура X-файла { пусть ключ: строка пусть имя файла: строка пусть данные: Данные var mimeType: Строка? пусть URL: URL вар toUrl : URL? вар 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
}
}
Оба отличные ответы. Будет ли причина делать одно вместо другого? Передача указателя или функция отключения звука?
struct
передается по значению. Поэтому, когда вы передаетеstruct
в качестве параметра, вы получите доступную только для чтения копию исходногоstruct
, которая в данном случае является константойlet
.