Попытка изменить переменную, установленную как 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 из своего 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 в функцию отправляет копию?
Я просто хочу убедиться, что понимаю и использую его правильно.

struct передается по значению. Поэтому, когда вы передаете struct в качестве параметра, вы получите доступную только для чтения копию исходного struct, которая в данном случае является константой let.
koropok 06.05.2022 07:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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 создает свою копию, когда вы передаете ее через функции.

Есть два решения:

  1. Либо измените структуру на класс.

  2. Создайте мутирующий метод в структуре, который может изменить 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
    }
    

    }

Оба отличные ответы. Будет ли причина делать одно вместо другого? Передача указателя или функция отключения звука?

Bartender1382 06.05.2022 19:37

Другие вопросы по теме