Подтвердить что ты не робот

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

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

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

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

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

Mutable Array

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

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

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

Mutable Dictionary

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

Ответ 1

Массивы

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

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

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 Developer

Ответ 2

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

Существуют классы массива и словаря, но следует отметить, что это типы значений, по сравнению с NSArray и NSDictionary, которые являются "объектными" типами.

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

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

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

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

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

Mutable массивы могут быть изменены так же, как 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 с помощью параметра метода 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.

Ответ 3

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

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

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

ПРЕДУПРЕЖДЕНИЕ: Неизменяемые массивы не являются полностью неизменными! Вы все равно можете изменить их содержимое, а не их общую длину!

Ответ 4

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

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

и

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

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

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

var myVariable = 42
myVariable = 50
let myConstant = 42

Прочитайте "Язык быстрого программирования" .

Ответ 5

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

var arr1 : Array = []

arr1.bridgeToObjectiveC().count

Он работает одинаково для let.

Ответ 6

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

Мутируемость коллекций

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

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

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

Ответ 7

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

var foundationDictionary = NSMutableDictionary(dictionary: dictionary)