2010-03-19 9 views
16

I nie wydają się rysunek się, jak uzyskać objective-c auto polu moje prymitywów.Auto Boks prymitywów

Sądziłem, że będę w stanie wykonać następujące

float foo = 12.5f; 
NSNumber* bar; 

bar = foo; 

Jednak uważam, że mam używany do bardziej opisowym metody

float foo = 12.5f; 
NSNumber* bar; 

bar = [NSNumber numberWithFloat:foo]; 

robię to źle, czy jest to Lepiej Być Nie Może?

Odpowiedz

28

Niestety, Objective-C nie robi auto-boxing lub unboxing prymitywnych typów do NSNumber. Gdy umieścić w ten sposób, może to być jasne, dlaczego: Objective-C nie ma pojęcia NSNumber klasa w ramach kakao Fundacji. Jako mały nadzbiór C, Objective-C nie ma "natywnego" numerycznego typu obiektu - tylko natywne typy C.

Edit sie 2012 Jak z Xcode 4.4 (i LLVM 4.0), można teraz korzystać z niektórych cukru składniowej zawinąć liczb. W następstwie swojej przykład te "zapakowane wyrażenia" teraz działa:

float foo = 12.5f; 
NSNumber* bar; 

bar = @(foo); 
bar = @12.5f; 
+6

mogę powiedzieć "niewygodnie" zamiast "niestety". Języki z auto- (nie) boksem nie są wolne od problemów - w rzeczywistości wiele z nich jest trudnych do wykrycia i może powodować dziwne problemy. Na przykład Efektywna Java i Java puzzlers poświęcić sporo stron do sprzątania zamieszanie o tym, jak działają numery niespodziewanie w różnych sytuacjach. Byłoby to dość wygodne, aby auto-boxing, ale dodanie go do samego języka (jak podkreślić) byłoby nietrywialne i prawdopodobnie obarczona ukrytych niebezpieczeństw. –

+1

@Quinn Absolutnie. Byłem naprawdę próbuje zrobić punkt, że Objective-C nie można łatwo zrobić autoboxing, nie starając się orzeczenie o sytuacji. Każdy z nas, który "cieszył się" z autoboxingu Jawy, wie, że to nie jest darmowy lunch. Słyszałem, że C# jest lepsze, ale nie ma osobistego doświadczenia, z którym można by sądzić. –

+4

Kto wraca 2 lata później, aby dostosować odpowiedź? Niesamowity. Szukałem nowej składni, dzięki! Więc oczywiście nie ma automatycznego rozpakowywania, prawda? –

0

Auto unboxing jest możliwe w Objective C ...

Proszę przeczytać poniższy kod

@interface Class1 : NSObject 
@property(nonatomic,assign)int intval; 
@end 

/// Teraz mamy zamiar wystąpienia Klasa1 w Class2 i mamy zamiar przypisać instancja zmiennej wartość poprzez refleksję

@implementation Class2 

-(void)TestClass1 
{ 
    Class1 *clsObj=[[Class1 alloc]init]; 

    [clsObj setValue:@"3" forKey:@"intval"]; 

    NSLog(@"%d",clsObj.intval); 

} 

@end 

Jeśli u uruchomić powyższy kod dostaniesz wartość 3 ... nie ma błędu

[clsObj setValue:@"3" forKey:@"intval"]; 

The intval jest podana wartość ciągu 3 i to auto unboxed przypisać jako int typu do instancji zmiennej intval

+0

Nie widzę, jak to się rozpakowuje. Myślałem, że rozpakowanie będzie oznaczało konwersję z NSNumber na typ pierwotny. – huggie