Неизменяемые / изменяемые коллекции в Swift



Я имел в виду руководство по программированию Apple Swift для понимания создания изменяемых/ неизменяемых объектов(массив, словарь, наборы, данные) на языке Swift. Но я не мог понять, как создать неизменяемые коллекции в Swift.



Я хотел бы видеть эквиваленты в Swift для следующего в Objective-C



Неизменяемый Массив



NSArray *imArray = [[NSArray alloc]initWithObjects:@"First",@"Second",@"Third",nil];


Мутабельный Массив



NSMutableArray *mArray = [[NSMutableArray alloc]initWithObjects:@"First",@"Second",@"Third",nil];
[mArray addObject:@"Fourth"];


неизменяемый Словарь



NSDictionary *imDictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"Value1", @"Key1", @"Value2", @"Key2", nil];


Изменяемый Словарь



NSMutableDictionary *mDictionary = [[NSMutableDictionary alloc]initWithObjectsAndKeys:@"Value1", @"Key1", @"Value2", @"Key2", nil];
[mDictionary setObject:@"Value3" forKey:@"Key3"];
905   7  

7 ответов:

массивы

создать неизменяемый массив

Первый способ:

let array = NSArray(array: ["First","Second","Third"])

второй вариант:

let array = ["First","Second","Third"]

создать изменяемый массив

var array = ["First","Second","Third"]

Добавить объект в массив

array.append("Forth")


словари

создать неизменяемый словарь

let dictionary = ["Item 1": "description", "Item 2": "description"]

создать изменяемые словарь

var dictionary = ["Item 1": "description", "Item 2": "description"]

добавить новую пару в словарь

dictionary["Item 3"] = "description"

дополнительная информация о разработчике Apple

Swift не имеет никакого падения в замене для NSArray или другие классы коллекции в Objective-C.

существуют классы array и dictionary, но следует отметить, что это типы "value", по сравнению с NSArray и NSDictionary, которые являются типами "object".

разница тонкая, но может быть очень важно, чтобы избежать ошибок крайнего случая.

в swift вы создаете "неизменяемый" массив с помощью:

let hello = ["a", "b", "c"]

и" изменяемый " массив с:

var hello = ["a", "b", "c"]

изменяемые массивы могут быть изменены так же, как NSMutableArray:

var myArray = ["a", "b", "c"]

myArray.append("d") // ["a", "b", "c", "d"]

однако вы не можете передать изменяемый массив в функцию:

var myArray = ["a", "b", "c"]

func addToArray(myArray: [String]) {
  myArray.append("d") // compile error
}

но приведенный выше код работает с NSMutableArray:

var myArray = ["a", "b", "c"] as NSMutableArray

func addToArray(myArray: NSMutableArray) {
  myArray.addObject("d")
}

addToArray(myArray)

myArray // ["a", "b", "c", "d"]

вы можете достичь NSMutableArray's поведение с помощью inout способ параметр:

var myArray = ["a", "b", "c"]

func addToArray(inout myArray: [String]) {
  myArray.append("d")
}

addToArray(&myArray)

myArray // ["a", "b", "c", "d"]

переписал этот ответ 2015-08-10, чтобы отразить текущий Swift поведение.

есть только один Array и Dictionary введите Swift. Изменчивость зависит от того, как вы его строите:

var mutableArray = [1,2,3]
let immutableArray = [1,2,3]

т. е. если вы создаете присвоение переменной, она изменчива, тогда как если вы создаете присвоение константе, это не так.

предупреждение: неизменяемые массивы не являются полностью неизменными! Вы все еще можете изменить их содержание, не их длина!

просто объявите свой (любой)объект или переменную с помощью

'let' key word -> for "constan/Immutable" array, dictionary, variable, object..etc.

и

'var' key word -> for "Mutable" array, dictionary, variable, object..etc. 

для более глубокой информации

"использовать пусть сделать константу и ВАР чтобы сделать переменную. Значение константы не должны быть известны во время компиляции, но вы должны присвоить ему значение ровно один раз. Это означает, что вы можете использовать константы для имени значения, которое вы определяете один раз, но используете во многих места."

var myVariable = 42
myVariable = 50
let myConstant = 42

Читать " Язык Программирования Swift."

если вы хотите работать с Array (Swift) как с NSArray, вы можете использовать простую функцию моста. Пример:

var arr1 : Array = []

arr1.bridgeToObjectiveC().count

Он работает то же самое для let.

из собственных документов Apple:

изменчивость коллекций

Если вы создадите массив, набор или словарь и назначите его переменная, созданная коллекция будет изменяться. Это средство что вы можете изменить (или мутировать) коллекцию после ее создания добавление, удаление или изменение элементов в коллекции. И наоборот, если вы назначаете массив, набор или словарь константе, которая коллекция неизменна, а ее размер и размеры содержание не может быть изменено.

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html#//apple_ref/doc/uid/TP40014097-CH8-ID105

другие виды использования неизменяемых/изменяемых коллекций зависят от того, почему вы хотите, чтобы они были изменяемыми / неизменяемыми. Коллекции - это стоимостью типы в Swift, что означает, что их содержимое копируется, когда они присваиваются другому значению или передаются другая функция/метод. Поэтому вам не нужно беспокоиться о том, может ли функция метода получения изменить исходный массив. Поэтому вам не нужно гарантировать возврат неизменяемой коллекции, если ваш класс содержит изменяемую коллекцию, например.

для этого нет встроенного приведения. Но вместо этого вы можете использовать инициализатор NSMutableDictionary, который принимает словарь:

var foundationDictionary = NSMutableDictionary(dictionary: dictionary)

Comments

    Ничего не найдено.