NSMutableArray'ı NSArray'e nasıl dönüştürebilirim Amaç-c?
NSArray *array = mutableArray;
NSMutableArray'ı NSArray'e nasıl dönüştürebilirim Amaç-c?
NSArray *array = mutableArray;
Yanıtlar:
NSArray *array = [mutableArray copy];
Copy
değişmez kopyalar yapar. Bu oldukça kullanışlıdır çünkü Apple çeşitli optimizasyonlar yapabilir. Örneğin copy
değişmez bir diziye göndermek sadece nesneyi korur ve geri döner self
.
Çöp toplama veya ARC kullanmıyorsanız -copy
, nesneyi koruduğunu unutmayın .
copy
normal bir NSArray oluşturan ve bir NSMutableArray oluşturan dokümanlardan nasıl anlatabilirim ?
NSArray
& NSMutableArray
, NSString
& NSMutableString
. Ancak, örneğin NSViewController
her zaman değişebilir durum içeren değil .
An NSMutableArray
, NSArray
her zaman dönüştürmeniz gerekmeyecek bir alt sınıftır, ancak dizinin değiştirilemeyeceğinden emin olmak istiyorsanız, otomatik NSArray
olarak yayınlanıp yayınlanmamasına bağlı olarak aşağıdaki yollardan birini oluşturabilirsiniz :
/* Not autoreleased */
NSArray *array = [[NSArray alloc] initWithArray:mutableArray];
/* Autoreleased array */
NSArray *array = [NSArray arrayWithArray:mutableArray];
DÜZENLEME: Georg Schölly tarafından sağlanan çözüm , bunu yapmanın daha iyi bir yolu ve çok daha temiz, özellikle de artık ARC'ye sahibiz ve otomatik yayınlama bile gerekmiyor.
Her iki ana çözümden de hoşlanıyorum:
NSArray *array = [NSArray arrayWithArray:mutableArray];
Veya
NSArray *array = [mutableArray copy];
En önemli fark Onlara gördüğünüz mutableArray nil olduğunda nasıl davrandığı olduğu :
NSMutableArray *mutableArray = nil;
NSArray *array = [NSArray arrayWithArray:mutableArray];
// array == @[] (empty array)
NSMutableArray *mutableArray = nil;
NSArray *array = [mutableArray copy];
// array == nil
[mutableArray copy]
için basitleştirilebilir [nil copy]
. Hedef-c'de nil'e gönderilen herhangi bir mesaj her zaman sıfır olacaktır. "Hiçbir şey" ile "içinde hiçbir şey olmayan bir dizi" arasındaki farkı hatırlamak önemlidir.
bu kodu deneyin ---
NSMutableArray *myMutableArray = [myArray mutableCopy];
ve
NSArray *myArray = [myMutableArray copy];
NSMutableArray'ı NSArray'e dönüştürmenin yolu:
//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;
Swift 3.0'da yeni veri türü Array var . Array let
anahtar sözcüğünü kullanarak bildirirse NSArray olur ve var
anahtar kelime kullanarak bildirilirse NSMutableArray olur .
Basit kod:
let newArray = oldArray as Array
Hedef-c'de:
NSArray *myArray = [myMutableArray copy];
Hızlı:
var arr = myMutableArray as NSArray
NSArray *array = mutableArray;
Bu [mutableArray copy]
antipattern tüm örnek kod üzerindedir. Geçici olan ve geçerli kapsamın sonunda yer değiştirilebilen sabit değişken diziler için bunu bırakın.
Çalışma zamanının, kapsam dışına çıkmak üzere olan, 0'a devredilen ve iyilik için ayrılmış olan değişken bir dizinin savurgan kopyalamasını optimize etmesinin bir yolu yoktur.
NSMutableArray
Bir NSArray
değişkene a atanması değişmez (OP'nin sorusu budur). Böyle bir değerin (örneğin, bir dönüş değeri veya bir özellik olarak) gösterilmesi, bu değer beklenmedik bir şekilde mutasyona uğramışsa sorunların ayıklanmasının çok zor olmasına neden olabilir. Değişken değer paylaşıldığı için bu hem iç hem de dış mutasyonlar için geçerlidir.
NSMutableArray
değişkene atamak yeterlidir. Nesne değişebilir bir dizi olmayı asla bırakmadığından, üzerinde mutasyon yöntemlerini çağırmak başarılı verileri değiştirir ve değiştirir. Öte yandan, orijinal mutable dizi kopyalanır - değiştirilemez bir dizi olarak değiştirilir ve daha sonra bir NSMutableArray
değişkene atanır ve üzerinde mutasyon yöntemleri çağrılırsa doesNotRespondToSelector
, mutasyon yöntemi çağrısını alan nesne içinde olduğundan bu çağrılar hatalarla başarısız olur gerçek değişmez ve bu yöntemlere cevap vermez.
Değişebilirlik yoluyla bir dizi oluşturuyorsanız ve ardından değiştirilemez bir sürüm döndürmek istiyorsanız, değiştirilebilen diziyi kalıtım yoluyla bir "NSArray" olarak döndürebilirsiniz.
- (NSArray *)arrayOfStrings {
NSMutableArray *mutableArray = [NSMutableArray array];
mutableArray[0] = @"foo";
mutableArray[1] = @"bar";
return mutableArray;
}
(Teknik olarak hala değiştirilebilir) dönüş nesnesini değişmez bir NSArray olarak işlemek için arayana "güvenirseniz", bu daha ucuz bir seçenektir [mutableArray copy]
.
Alınan bir nesneyi değiştirip değiştiremeyeceğini belirlemek için, bir iletinin alıcısının dönüş değerinin biçimsel türüne bağlı olması gerekir. Örneğin değişmez olarak yazılan bir dizi nesnesi alırsa, onu değiştirmeye çalışmamalıdır . Bir nesnenin sınıf üyeliğine göre değiştirilebilir olup olmadığını belirlemek kabul edilebilir bir programlama uygulaması değildir.
Yukarıdaki uygulama burada daha ayrıntılı olarak tartışılmaktadır:
En İyi Uygulama: Dönüş türü NSArray ise Return mutableArray.copy veya mutableArray
hızlı 3 cevap aramak oldu ve bu soru arama ilk sonuç olarak gösterildi ve burada hızlı 3 kodu işte cevap ilham
let array: [String] = nsMutableArrayObject.copy() as! [String]
NSArray *array = [mutableArray copy];