Ответ 1
Вопрос задан странно, так как ваш первый myItems
не является массивом различных массивов, это просто массив строк. Тем не менее, я попытаюсь обсудить этот вопрос более общим образом.
Swift не отличает mutable от неизменяемых массивов способом Cocoa NSArray. Но зачем вам это нужно? Cocoa нуждается в нем, потому что NSArray - это класс, поэтому, если он изменен, он может быть изменен за MyClass. Но в Swift массив является типом значений, поэтому этого не может быть.
Итак, какую проблему вы действительно пытаетесь решить? Вы должны спросить себя, какой контракт вы пытаетесь выполнить за пределами объектов, и попытаться написать этот контракт в структуру MyClass. Ваш массив структур является вполне разумным подходом. Я думаю, однако, что то, что вы здесь, может быть конфиденциальностью, а не неизменностью. Например, я могу сказать следующее:
class MyClass{
private var myItemsHidden = [String]()
var myItems:[String] {
get {
return myItemsHidden
}
set {
myItemsHidden = newValue
}
}
}
Теперь, полагая, что MyClass остался один в своем собственном файле (потому что private
в Swift означает private для файла), myItemsHidden
можно манипулировать любым способом из MyClass, поэтому, возможно, MyClass не хочет мутировать никаких субмарины или что-то еще, что вы пытаетесь предотвратить. Это зависит от MyClass, что он позволяет себе делать с myItemsHidden
.
Но извне MyClass myItemsHidden
не существует; существует только myItems
, и единственное, что можно сделать с ним, это получить его и установить. (Если они его получают и меняют, оригинал не изменяется, они не могут мутировать оригинал.) Если ваша цель состоит в том, чтобы запретить кому-либо из внешних настроек myItems
вообще, удалите функцию setter:
class MyClass{
private var myItemsHidden = [String]()
var myItems:[String] {
get {
return myItemsHidden
}
}
}
Теперь myItems
представляет собой просто выданный (расширенный) массив и не более.
Если идея состоит в том, что другим классам должно быть разрешено добавлять новые массивы в массив массивов, вы можете добавить метод MyClass, который позволит им это сделать. Другими словами, теперь, когда эта вещь является частной, вам решать, какой доступ вы предоставляете другим. MyClass становится привратником для того, что другие классы могут сделать с этим значением, потому что само значение скрыто за стеной private
.