objective c - Como faço para converter NSMutableArray para NSArray?




objective-c cocoa-touch (6)

Objetivo-C

Abaixo está a maneira de converter NSMutableArray para NSArray:

//oldArray is having NSMutableArray data-type.
//Using Init with Array method.
NSArray *newArray1 = [[NSArray alloc]initWithArray:oldArray];

//Make copy of array
NSArray *newArray2 = [oldArray copy];

//Make mutablecopy of array
NSArray *newArray3 = [oldArray mutableCopy];

//Directly stored NSMutableArray to NSArray.
NSArray *newArray4 = oldArray;

Rápido

No Swift 3.0, há um novo tipo de dados Array . Declare Array usando let keyword então ele se tornaria NSArray E se declarar usando var keyword então ele se torna NSMutableArray .

Código de amostra:

let newArray = oldArray as Array

Como faço para converter NSMutableArray para NSArray no objective-c ?


Eu estava procurando a resposta em swift 3 e esta questão foi mostrada como primeiro resultado na pesquisa e eu me inspirar a resposta dele, então aqui está o código 3 rápido

let array: [String] = nsMutableArrayObject.copy() as! [String]

Se você está construindo uma matriz via mutabilidade e, em seguida, deseja retornar uma versão imutável, você pode simplesmente retornar a matriz mutável como um "NSArray" via herança.

- (NSArray *)arrayOfStrings {
    NSMutableArray *mutableArray = [NSMutableArray array];
    mutableArray[0] = @"foo";
    mutableArray[1] = @"bar";

    return mutableArray;
}

Se você "confiar" no chamador para tratar o objeto de retorno (tecnicamente ainda mutável) como um NSArray imutável, essa é uma opção mais barata que [mutableArray copy] .

A Apple concorda:

Para determinar se pode alterar um objeto recebido, o destinatário de uma mensagem deve confiar no tipo formal do valor de retorno. Se ele receber, por exemplo, um objeto de matriz digitado como imutável, ele não deve tentar alterá-lo . Não é uma prática de programação aceitável determinar se um objeto é mutável com base em sua associação de classe.

A prática acima é discutida em mais detalhes aqui:

Melhor prática: retorne mutableArray.copy ou mutableArray se o tipo de retorno for NSArray


Um NSMutableArray é uma subclasse do NSArray para que você não precise sempre converter, mas se você quiser ter certeza de que o array não pode ser modificado, você pode criar um NSArray uma destas formas dependendo se você quer que ele seja liberado ou não:

/* Not autoreleased */
NSArray *array = [[NSArray alloc] initWithArray:mutableArray];

/* Autoreleased array */
NSArray *array = [NSArray arrayWithArray:mutableArray];

EDIT: A solução fornecida por Georg Schölly é uma maneira melhor de fazê-lo e muito mais limpo, especialmente agora que temos ARC e nem sequer tem que chamar autorelease.


No objetivo-c:

NSArray *myArray = [myMutableArray copy];

Em rápida:

 var arr = myMutableArray as NSArray

NSArray *array = [mutableArray copy];

Copy faz cópias imutáveis. Isso é bastante útil porque a Apple pode fazer várias otimizações. Por exemplo, enviar copy para um array imutável apenas retém o objeto e retorna self .

Se você não usa coleta de lixo ou ARC, lembre-se de que -copy retém o objeto.





nsarray