Начните с утверждения, что Swift делает строки «изменяемыми», действительно ли изменяемые строки Swift изменяемы или они такие же, как строки Java?, но исходя из общепринятого (и не-Swift) определения изменчивости, т.е. строго ценить неизменность, без учета привязок
Можно ли на самом деле изменить строковое значение так, чтобы оно печатало «истина»?
var str = "Mutate me!"
let a1 = (unsafeAddressOf(str))
// some 'mutating operation'
let a2 = (unsafeAddressOf(str))
print(a1 == a2)
Меня не интересуют "структурные типы" или семантика отложенного копирования. Этот вопрос касается того, можно ли изменить строковое значение изнутри Swift, хотя было бы также интересно посмотреть, можно ли это изменить другими... окольными способами. (Если нет, то глупо даже обсуждать значение и ссылочные типы вместо чисто соображений изменчивости.)
Мне известны методы "мутации"< /em>, но не согласен с тем, что они "мутируют" строковое значение. В приведенном выше примере let
должен быть заменен в окончательной программе. Если let
нельзя заменить; или иначе нельзя доказать, что объект является одним и тем же, тогда изменчивость не была показана.
unsafeAddressOf()
принимает параметрAnyObject
, то есть экземпляр класса, аString
— это структура. Итак, вы получаете не адрес структуры, а(unsafeAddressOf(str as NSString))
из-за автоматического моста. Я думаю, что вы можете получить настоящий адрес с помощьюwithUnsafePointer(&str) { print($0) }
, и это не изменится при мутации строки. - person Martin R   schedule 17.09.2015