2011-11-08 18 views
6


Bazı NSNumbers yüklü olan basit bir NSSet'e sahip olmak ve daha sonra bu sayıların kümeye eklenip eklenmediğini öğrenmek istiyorum. Bunu yaparken:NSNumbers NSSet - üye yöntemi null

NSMutableSet *set = [[NSMutableSet alloc] init]; 
NSNumber *num1 = [NSNumber numberWithInt:5]; 
NSNumber *num2 = [NSNumber numberWithInt:5]; 
[set addObject:num1]; 
if([set member:num2]){ 
    // something... 
} 

sorun bu numaraları aynı olsa bile, (yanlış ise) üyesi daima nil döndürür olmasıdır. isEqual yöntemi true değerini döndürür. Yani dokümanlar ise

if([num1 isEqual:num2]){ 
    // correct 
} 

eser ...
Ben üye yöntemi IsEqual yüzden ... sorunun ne herhangi bir tavsiye için Teşekkür bilmiyorum kullandığı okuyun.

+0

Kodunuz doğru bir şekilde yapıştırılmışsa, setinize – Maggie

+0

no'lu nesneyi eklemediniz, emin misiniz .. kodunuz benim için gayet iyi çalışıyor! – Devarshi

+0

@Maggie evet Eminim, nokta şu ki, sayı 5'in zaten kümede olup olmadığını kontrol etmek istiyorum, ancak nesneler oldukları için nsnumber kullanmam gerekiyor, bu yüzden nsnumber nesnesinin 5 değerine sahip olup olmadığını kontrol etmek istiyorum Zaten sette (5 değeri ile num1, bu yüzden doğru dönmelidir) – haluzak

cevap

2

Sorun şu ki, num1 ve num2'un aynı nesne olup olmadığını kontrol ediyorsunuz. Ve değiller. Sadece aynı değere sahipler ama aynı değere sahip iki farklı nesne.

member ile neler denetlediğiniz, aynı adrese sahip olup olmadıklarıdır.

Düzenleme: Sayıların değerleri aynı olup olmadığını kontrol etmek için compare kullanmalısınız!

+0

bellekte "doğru değil; üyeye göre: docs: "Eğer set nesneye eşit bir nesne içeriyorsa (isEqual :) tarafından belirlendiği gibi, o nesne (genellikle bu nesne olacaktır), aksi halde sıfırdır." – Wevah

+0

İkiniz de doğru olabilirsiniz ...NSNumber'in, ilk birkaç tam sayı için statik gösterimleri olduğu gizli bir optimizasyona sahip olduğunu hatırlıyorum. Bu durumda, _and_ isEqual bellek adresi çalışır. – jrturton

+0

Elbette, ama her iki şekilde de yanlış geri dönmemeli. – Wevah

4

Nesneleri değil, NSNumbers değerlerini karşılaştırmak gerekir.

NSMutableSet *set = [[NSMutableSet alloc] init]; 
NSNumber *num1 = [NSNumber numberWithInt:5]; 
NSNumber *num2 = [NSNumber numberWithInt:5]; 
NSNumber *num3 = [NSNumber numberWithInt:3]; 
[set addObject:num1]; 

NSSet *filteredSet; 
filteredSet = [set objectsPassingTest:^(id obj,BOOL *stop){ 
    return [obj isEqualToNumber:num2]; 
}]; 
NSLog(@"Contains num2: %@", (filteredSet.count == 1) ? @"YES" : @"NO"); 

filteredSet = [set objectsPassingTest:^(id obj,BOOL *stop){ 
    return [obj isEqualToNumber:num3]; 
}]; 
NSLog(@"Contains num3: %@", (filteredSet.count == 1) ? @"YES" : @"NO"); 

NSLog çıkışı::

Contains num2: YES 
Contains num3: NO 

Ya yüklemler'ıN kullanılarak isteniyorsa:

filteredSet = [set filteredSetUsingPredicate:[NSPredicate predicateWithFormat:@"SELF == %@", num2]]; 
NSLog(@"Contains num2: %@", (filteredSet.count == 1) ? @"YES" : @"NO"); 

filteredSet = [set filteredSetUsingPredicate:[NSPredicate predicateWithFormat:@"SELF == %@", num3]]; 
NSLog(@"Contains num3: %@", (filteredSet.count == 1) ? @"YES" : @"NO"); 
2

morina

Sen objectsPassingTest:

Örnek kullanabilirsiniz Merhaba kelimesi günlüğüne yazılır beri NSArray kullandığınızda ben o

NSMutableSet *set = [[NSMutableSet alloc] init]; 
NSNumber *num1 = [NSNumber numberWithInt:5]; 
NSNumber *num2 = [NSNumber numberWithInt:5]; 
[set addObject:num1]; 
if([set member:num2]){ 
    NSLog(@"Hello, world"); 
    } 
+0

Bu, tam olarak geçerli değil çünkü * num1 değerini 6'ya değiştirdikten sonra sete ekledikten sonra [set üye numarası1] ve [set num2] ayarı her ikisi de true değerini döndürür. –

+0

@RyanHeitner, Bir NSNumber nesnesini nasıl değiştirebilirim? Değişmezler! – ragnarius

+0

NSNumber * num1 = [NSNumber numberWithInt: 5]; [set addObject: num1]; num1 = [NSNumber numberWithInt: 6]; –

4

çalıştırmak yerine nesnelerin kendileri değerlerini karşılaştırmak gerektiğinde e çalışır. NSArray kullanmak yerine NSMutableIndexSet'i kullanabilirsiniz. Bu, değerleri birkaç daha az adımla karşılaştırmanıza olanak tanır.

//during init, add some numbers 
NSMutableIndexSet *tSet = [[NSMutableIndexSet alloc] init]; 
NSUInteger exampleValue = 7; 
[tSet addIndex:exampleValue]; 
exampleValue = 42; 
[tSet addIndex:exampleValue]; 

//...later on 
//look to see if numbers are there 
if ([tSet containsIndex:7]){ 
    NSLog(@"7 exists!"); 
} 
if ([tSet containsIndex:8]){ 
    NSLog(@"8 exists!"); 
} 

Çıktı: 7 var !