Я имел в виду руководство 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"];
ios
objective-c
swift
immutability
mutable
Пранав Джайсвал
источник
источник
Dictionary
действительно неизменен (в отличие от Array)var
.Swift не имеет возможности заменить
NSArray
или другие классы коллекций в Objective-C.Существуют классы массивов и словарей, но следует отметить, что это типы «значения» по сравнению с NSArray и NSDictionary, которые являются типами «объекта».
Разница небольшая, но может быть очень важной, чтобы избежать ошибок крайнего случая.
В 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
поведения, используяinout
параметр метода:var myArray = ["a", "b", "c"] func addToArray(inout myArray: [String]) { myArray.append("d") } addToArray(&myArray) myArray // ["a", "b", "c", "d"]
Переписал этот ответ 10 августа 2015 г., чтобы отразить текущее поведение Swift.
источник
В Swift есть только один
Array
и одинDictionary
тип. Изменчивость зависит от того, как вы ее сконструируете: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
Прочтите «Быстрый язык программирования».
источник
Если вы хотите работать с
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, что означает, что их содержимое копируется, когда они назначаются другому значению или передаются другой функции / методу. Следовательно, вам не нужно беспокоиться о том, может ли функция метода получения изменить исходный массив. Следовательно, вам не нужно гарантировать возврат неизменяемой коллекции, например, если ваш класс содержит изменяемую коллекцию.
источник
[Неизменяемый и неизменный]
Массив Swift можно отключить
[let vs var, значение vs тип ссылки]
Неизменяемая коллекция [О] - это коллекция, структура которой не может быть изменена. Это означает, что вы не можете добавлять, удалять, изменять после создания
let + struct
(напримерArray
,Set
,Dictionary
) является более подходящим , чтобы быть неизменныЕсть несколько классов (например,
NSArray
), которые не предоставляют интерфейс для изменения внутреннего состоянияно
class A { var value = "a" } func testMutability() { //given let a = A() let immutableArr1 = NSArray(array: [a]) let immutableArr2 = [a] //when a.value = "aa" //then XCTAssertEqual("aa", (immutableArr1[0] as! A).value) XCTAssertEqual("aa", immutableArr2[0].value) }
Лучше бы
unmodifiable
массивисточник