2012-03-27 10 views
4

in Objective-C Ich versuche, den folgenden Ausdruck zu bewerten: _c = _f/5 * 8; Es sagt mir, dass ein int und ein NSNumber ungültige Argumente auf einen binären Ausdruck sind.Math mit NSNumbers und Ints

Was ist los? Ich beginne gerade mit objective-c und Kakao, bin aber vertraut mit PHP und Basic und irgendwie vertraut mit Javascript.

+2

Welche Variablen sind _c und _f? – Manuel

+0

_c und _f sind Fahrenheit und Celsius (Entschuldigung, wenn ich sie nicht richtig buchstabiert habe.) – yskywalker

Antwort

10

Objective-C verfügt über verschiedene Strukturen, die Sie für Berechnungen verwenden können. Von seinen C Wurzeln kommen die primitiven Zahlen, int s, float s, double, etc, auf das Sie direkt arithmetische Operationen durchführen kann (+, -, *, /, etc.). Dies sind, was Sie suchen.

Auf einem höheren Hebel hat Objective-C auch NSNumber Objekte, die einfache Wrapper für die oben aufgeführten primitiven Typen sind. Sie werden überall in Objective-C verwendet, wo Grundelemente gespeichert werden müssen (oft in anderen Objekten wie Arrays und Dictionaries, die nicht direkt Grundwerte annehmen). Da NSNumber s Objekte sind, können Sie keine direkten arithmetischen Operationen für sie ausführen. Sie müssen zuerst ihre primitiven Werte zeichnen (z. B. intValue, um einen ganzzahligen Wert zu erhalten, oder doubleValue, um eine Gleitkommazahl doppelter Genauigkeit zu erhalten). Da es unklar ist, was die Variablen in Ihrer Frage darstellen, wage ich keine Vermutung darüber, was Sie versuchen zu tun (ich möchte Sie nicht irreführen), aber Sie können mehr über NSNumber herausfinden in der NSNumber Class Reference.

Schließlich, wie Richard erwähnt, gibt es NSDecimalNumber s. Diese werden fast nie verwendet, da sie entweder einfach nicht benötigt werden (sie sind so konstruiert, dass sie extrem hochpräzise Zahlen enthalten, weit jenseits der Kapazität von regulären Grundwerten) oder zu kompliziert in der Verwendung. Sie haben auch ihre eigenen Methoden zum Ausführen arithmetischer Operationen und sind im allgemeinen für den täglichen Gebrauch irrelevant. Wenn Sie interessiert sind, schauen Sie sich die NSDecimalNumber Class Reference genauer an.

In den meisten Fällen möchten Sie für die Berechnung primitive Zahlen verwenden. Wenn Sie sie speichern müssen, können Sie die Objekte NSNumber oft "boxen" und "auspacken" (speichern und abrufen).

+3

+1, aber ich würde sagen, dass NSDecimalNumber ein großer Typ ist, der für Währungswerte verwendet wird. – JeremyP

+0

@ JeremyP Ja, aber abhängig von den Währungen, mit denen Sie zu tun haben, und den Operationen, die Sie durchführen, würde ich sogar argumentieren, dass es eine bessere Idee ist, Ihre Währung als ganzzahlige Vielfache Ihres Basiswertes darzustellen (zB alles in Begriffen zu speichern) von Cents und nicht von Dollars), also umgehen Sie jeden Bedarf an gebrochenen Geldbeträgen (die kleine Cents machen - äh, Sinn). Natürlich, wenn Sie Prozentsätze oder Umrechnungen machen, dann ist 'NSDecimalNumber' tatsächlich eine gute Wahl. –

4

Sie können diese Dinge nicht mit Objekten (NSNummer in diesem Fall). Sie müssen also den Wert 'int/double/long/float' nehmen. Ich weiß nicht, was man NSNumber ist, so sind hier zwei Lösungen, 1 funktioniert:

_c = [_f doubleValue]/5 * 8; 

oder:

_c = [NSNumber numberWithDouble:(_f/5 * 8)]; 

Hoffe, es hilft

1

NSNumber s kann nicht mathematische Symbole angewendet zu ihnen. In Ihrem Fall würde der Code tatsächlich so aussehen, mit NSDecimalNumber statt (die Wähler zu multiplizieren und dividieren Zahlen hat):

NSDecimalNumber *_c = nil; 
NSDecimalNumber *_f = [NSDecimalNumber decimalNumberWithString:@"7"]; 

_c = [[_f decimalNumberByDividingBy:[NSDecimalNumber decimalNumberWithString:@"5"]] decimalNumberByMultiplyingBy:[NSDecimalNumber decimalNumberWithString:@"8"]]; 

Es ist hässlich, aber es ist, wie Objective-C befasst sich mit Zahlen. Ihre andere Alternative besteht darin, die doppelten Werte jeder Ihrer Zielnummern zu erhalten und sie dann zu multiplizieren.

+1

Diese Antwort ist irreführend.'NSDecimalNumbers' sind nicht" wie Objective-C mit Zahlen handelt ", sondern eher eine Klasse, die für Computer sehr hochpräzise Zahlen verwendet. Sie sollen nicht für einfache Mathematik wie diese verwendet werden; Es gibt keinen Grund, sie in diesem Fall über normale NSNumbers zu verwenden. –

+0

@ItaiFerber nicht wahr. Ein Hauptvorteil der Verwendung einer NSDecimalNumber ist ihre Genauigkeit, und selbst für kleine Berechnungen wie die obige ist der Overhead, der für die Genauigkeit benötigt wird, sehr nützlich und hat den Vorteil, dass sie gegenüber primitiven Typen in ein Array eingefügt wird. Vergessen Sie auch nicht, dass die Multiplikation mit NSNumber -doubleValue sehr verlustbehaftet ist und zu einem beträchtlichen Verlust an Genauigkeit führen kann, z. 1/5 * 5! = 1, und Sie müssen sich auch keine Gedanken über eine Ganzzahl-zu-Ganzzahl-Teilung machen. Die Profis überwiegen die Nachteile, deshalb wähle ich NSDecimalNumber –

+1

Während ich Ihnen zustimme, dass sie sicherlich ihre Vorteile haben, denke ich nicht, dass sie es wert sind, einfach etwas mit '5/8' zu multiplizieren - dieses Niveau von Präzision ist normalerweise nicht notwendig oder wünschenswert. Nochmals, ich habe nicht einfach gestimmt, weil Sie vorgeschlagen haben, 'NSDecimalNumber' zu verwenden (ich finde sie faszinierend und würde sie gerne öfter einsetzen), aber einfach weil ich es irreführend finde, jemandem zu sagen, der den Unterschied noch nicht kennt "Das ist der Weg, es zu tun". Sehen Sie meine Antwort für das, was ich denke. –