2010-10-22 14 views
52

Yapmak istediklerim:NSRange'ı NSMutableArray veya başka bir kapsayıcıda nasıl depolarım?

NSRange r = NSMakeRange(0,5); 
id a = [NSMutableArray a]; 
[a addObject: r]; // but NSRange is not a NSObject * 

Boole ile şöyle bir kod kullanırdım:

[a addObject: [NSNumber numberWithBool: YES]]; 

veya bir tamsayı ile:

[a addObject: [NSNumber numberWithInteger: 3]]; 

Öyleyse eşdeğer nedir NSRange ile? Gerçekten yapmak istemediğim, bunu gerçekleştirmek için kendi NSObject alt sınıfımı oluşturmak. Kuşkusuz, Apple'ın hali hazırda verdiği bir şey var mı?

cevap

130

Use NSValue's +valueWithRange:. Aralık yapısını geri almak için property rangeValue'u kullanın. Eğer bir mülk listesinde NSRange saklamak gerekiyorsa

[a addObject:[NSValue valueWithRange:r]]; 
... 

NSRange r = a[4].rangeValue; 
+2

NSValue neden NSRange depolayabilir, ancak NSArray bulamadı? – antonio081014

+3

Çünkü "NSArray" yalnızca nesneleri saklayabilir. 'NSRange' bir nesne değildir, ancak 'NSValue' ile sarabilirsiniz, böylece NSMutable dizisi, NSDictionary' vb. Tarafından kullanılabilir. –

+0

NSMutable dizisiyle yinelenirken, NSRange r = a [i] .rangeValue verme hatası type range türünde property range değeri bulunamadı ... –

11
[NSValue valueWithRange:r]; 

ve arka dışarı almak:

NSRange r = [rangeObject rangeValue]; 
+0

rangeobject nedir? –

5

, ayrıca NSStringFromRange işlevini kullanarak bir NSString içine NSRange açabilirsiniz. Ve sonra, bu dizeyi NSRangeFromString işlevini kullanarak bir aralığa dönüştürebilirsiniz.

+1

Bu zekice ve kullanışlı olduğu için, ancak NSValue daha az dirsek gibi görünüyor. Teşekkürler. :) –

+0

Teşekkürler! NSValue’yi kendim diğer cevaplardan öğrendim (teşekkürler @mipadi ve @KennyTM) ve kesinlikle önerimden daha az dirsekli. Senin türden daha fazla haklı olmak için, ben dize sürümü mülkiyet listelerinde aralıkları depolama ile yararlı olabileceğini belirtmek için cevabımı güncelledi. –

4

Başka bir seçenek, daha sonra kullanmayı nasıl amaçladığınıza bağlı olarak bu aralıkları NSIndexSet'a eklemek olabilir.

İlgili konular