Eu estava me referindo ao guia de programação Swift da Apple para compreender a criação de objetos mutáveis / imutáveis (Array, Dicionário, Conjuntos, Dados) na linguagem Swift. Mas eu não conseguia entender como criar coleções imutáveis em Swift.
Eu gostaria de ver os equivalentes em Swift para o seguinte em Objective-C
Matriz Imutável
NSArray *imArray = [[NSArray alloc]initWithObjects:@"First",@"Second",@"Third",nil];
Matriz Mutável
NSMutableArray *mArray = [[NSMutableArray alloc]initWithObjects:@"First",@"Second",@"Third",nil];
[mArray addObject:@"Fourth"];
Dicionário imutável
NSDictionary *imDictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"Value1", @"Key1", @"Value2", @"Key2", nil];
Dicionário Mutável
NSMutableDictionary *mDictionary = [[NSMutableDictionary alloc]initWithObjectsAndKeys:@"Value1", @"Key1", @"Value2", @"Key2", nil];
[mDictionary setObject:@"Value3" forKey:@"Key3"];
ios
objective-c
swift
immutability
mutable
Pranav Jaiswal
fonte
fonte
Dictionary
é verdadeiramente imutável (oposto a Array)var
.O Swift não tem nenhuma queda na substituição
NSArray
ou nas outras classes de coleção em Objective-C.Existem classes de matriz e dicionário, mas deve-se observar que esses são tipos de "valor", em comparação com NSArray e NSDictionary, que são tipos de "objeto".
A diferença é sutil, mas pode ser muito importante para evitar bugs de casos extremos.
Em swift, você cria uma matriz "imutável" com:
let hello = ["a", "b", "c"]
E uma matriz "mutável" com:
var hello = ["a", "b", "c"]
Matrizes mutáveis podem ser modificadas como
NSMutableArray
:var myArray = ["a", "b", "c"] myArray.append("d") // ["a", "b", "c", "d"]
No entanto, você não pode passar uma matriz mutável para uma função:
var myArray = ["a", "b", "c"] func addToArray(myArray: [String]) { myArray.append("d") // compile error }
Mas o código acima funciona com um NSMutableArray:
var myArray = ["a", "b", "c"] as NSMutableArray func addToArray(myArray: NSMutableArray) { myArray.addObject("d") } addToArray(myArray) myArray // ["a", "b", "c", "d"]
Você pode obter
NSMutableArray
o comportamento de usando uminout
parâmetro de método:var myArray = ["a", "b", "c"] func addToArray(inout myArray: [String]) { myArray.append("d") } addToArray(&myArray) myArray // ["a", "b", "c", "d"]
Reescreveu esta resposta 10/08/2015 para refletir o comportamento atual do Swift.
fonte
Existe apenas um
Array
e umDictionary
tipo no Swift. A mutabilidade depende de como você a constrói:var mutableArray = [1,2,3] let immutableArray = [1,2,3]
ou seja, se você criar uma atribuição para uma variável, ela será mutável, mas se você criar uma atribuição para uma constante, ela não será.
AVISO: Matrizes imutáveis não são totalmente imutáveis! Você ainda pode alterar o conteúdo, mas não o comprimento total!
fonte
Basta declarar seu (qualquer) objeto ou variável com
'let' key word -> for "constan/Immutable" array, dictionary, variable, object..etc.
e
'var' key word -> for "Mutable" array, dictionary, variable, object..etc.
Para informações mais detalhadas
var myVariable = 42 myVariable = 50 let myConstant = 42
Leia “A linguagem de programação rápida”.
fonte
Se você deseja trabalhar com
Array
(Swift) como comNSArray
, pode usar uma função de ponte simples. Exemplo:var arr1 : Array = [] arr1.bridgeToObjectiveC().count
Funciona da mesma forma para
let
.fonte
Dos próprios documentos da Apple:
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/CollectionTypes.html#//apple_ref/doc/uid/TP40014097-CH8-ID105
Outros usos de coleções imutáveis / mutáveis dependem de por que você deseja que elas sejam mutáveis / imutáveis. Coleções são tipos de valor em Swift, o que significa que seu conteúdo é copiado quando atribuído a outro valor ou passado para outra função / método. Portanto, você não precisa se preocupar se uma função de método de recebimento pode alterar o array original. Portanto, você não precisa garantir o retorno de uma coleção imutável se sua classe está mantendo uma coleção mutável, por exemplo.
fonte
[Não modificável e imutável]
O array do Swift pode ser silenciado
[let vs var, Value vs Reference Type]
Coleção imutável [Sobre] - é uma estrutura de coleção que não pode ser alterada. Isso significa que você não pode adicionar, remover, modificar após a criação
let + struct
(comoArray
,Set
,Dictionary
) é mais adequado para ser imutávelExistem algumas classes (por exemplo
NSArray
) que não fornecem uma interface para alterar o estado internomas
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) }
Ele prefere ser
unmodifiable
arrayfonte