Я использую структуру со свойством let name: String
struct StudentStruct {
let name:String
}
Я использую это в viewDidLoad как
var obj = StudentStruct(name: "Leo")
var copyObject = obj// Should copy all variables from obj
obj.name = "Jhon" // Assign new name ... <Giving error>
Мы знаем, что obj.name = "Jhon" невозможно из-за того, что имя является let свойством,
Я не хочу ничего менять из StudentStruct
Как лучше всего использовать StudentStruct там, где разрешена модификация name
Вы должны создать новый объект со всеми свойствами из старого, кроме name = ”new value” : obj = obj(name: “new value”, otherProperty: obj. OtherPtoperty,…)
@PtitXav Пожалуйста, предоставьте ответ в разделе ответов с подробностями
@loremipsum, как говорится в вопросе, я НЕ хочу ничего менять из StudentStruct





Что бы я сделал, так это обернул неизменную структуру ученика и затмил неизменяемое имя изменяемым именем, например так:
struct StudentStruct {
let name: String
}
struct StudentStructWrapper {
private var wrapperName: String?
var name: String {
get { wrapperName ?? studentStruct.name }
set { wrapperName = newValue}
}
private let studentStruct: StudentStruct
init(studentStruct: StudentStruct) {
self.studentStruct = studentStruct
}
}
Использование:
let student = StudentStruct(name: "Matt")
var wrapper = StudentStructWrapper(studentStruct: student)
print(wrapper.name) // Matt
wrapper.name = "Ethan"
print(wrapper.name) // Ethan
Написав аналогичные вычисляемые переменные для любых других свойств, вы можете заставить оболочку выглядеть точно так же, как StudentStruct, за исключением того, что ее имя может быть изменено. Между тем базовая StudentStruct (очевидно) не затронута.
Хорошее предложение, но я бы начал ответ со слов: «Самое простое, что нужно сделать, это изменить StudentStruct, чтобы иметь изменяемое свойство name. Если вы не владеете StudentStruct или есть другие соображения, когда вы хотите сохранить свойство name неизменным, тогда ..."
@DuncanC (1) Это уже предлагалось. (2) В вопросе говорится: «Я не хочу ничего менять в StudentStruct». Это предпосылка вопроса. Мой ответ касается вопроса, который на самом деле был задан, как я его понял. Я был в такой ситуации, и это решение, которое я использовал. Конечно, я могу ошибаться в вопросе (он был задан не очень четко), но я так его воспринял. Если вы думаете иначе, не стесняйтесь дать свой собственный ответ; Пожалуйста, не говори мне, что сказать. Спасибо.
Мэтт, я пропустил немного о том, что не хочу менять StudentStruct.
Это довольно распространенный шаблон для создания метода, который возвращает аналогичную, но измененную копию исходного экземпляра:
extension StudentStruct {
func with(
name: String = self.name/*,
otherProp: OtherProp = self.otherProp, etc… */
) -> StudentStruct {
StudentStruct.new(name: name/*, otherProp: otherProp, etc…*/)
}
}
let leo = StudentStruct(name: "Leo")
let john = leo.with(name: "John")
Ты ГЕРОЙ
Изменить let на var