解释为什么这不起作用:
分号
#define kCountry "Country";
在这种情况下,我收到了来自 xCode 的红色警告 - 预期]
没有所谓的“红色警告”。警告为黄色;错误为红色。
(除非您打开“将警告视为错误”;然后,从某种意义上说,所有警告都是红色的——因为它们是错误。)
反正。
诸如#define
不需要分号的预处理器指令。如果您包含一个,它将成为指令的一部分。
预处理器将任何宏替换为您定义的任何宏。在这种情况下,您定义了一个名为“<code>kCountry”的宏,其值为“<code>"Country;”。请注意,分号是值的一部分——指令在行尾结束,而不是在分号。
因此,当您使用宏时:
[[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:kCountry];
float test= [[NSUserDefaults standardUserDefaults]floatForKey:kCountry];
预处理器替换宏如下:
[[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:"Country";];
float test= [[NSUserDefaults standardUserDefaults]floatForKey:"Country";];
分号不能放在语句中;它必须紧随其后。因此,上述陈述无效。
解决方法是从 d 宏的行中删除分号#define
,以便分号不会出现在输出中:
[[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:"Country"];
float test= [[NSUserDefaults standardUserDefaults]floatForKey:"Country"];
顺便说一句,Xcode 在它的 Jump Bar 中有一个选项可以向您显示代码的完整预处理版本,因为编译器会看到它。这在调查宏观问题时会很方便。
所以,这是问题之一。另一个是……</p>
您使用的字符串类型
"Country"
是一个 C 字符串。它仅适用于 C 字符串和 stdio 库(包括函数printf
、strcat
等)以及需要 C 字符串的各种其他 API(例如+[NSString stringWithUTF8String:]
和+[NSString stringWithCString:encoding:]
)。
NSUserDefaults,就像 Cocoa 中需要字符串的所有其他东西一样,需要一个 Cocoa 字符串对象——一个 NSString。NSString 字面量的语法是相同的,但@
前面有一个:@"Country"
。
因此有效的版本:
#define kCountry @"Country"
产生预处理的输出:
[[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:@"Country"];
float test= [[NSUserDefaults standardUserDefaults]floatForKey:@"Country"];
在这两个地方都没有语法错误和正确类型的字符串,这是可以工作的版本。
哦,而且,正如 Anoop Vaidya 已经指出的那样:
数字语法
您尝试为变量分配一个数字,但我认为您会在那里找到一个与您预期不同的数字。
floatCountries = 74,2;
如果您使用以下语句打印此变量的值:
NSLog(@"%f", floatCountries);
你会发现输出是2.0
.
C 有一个称为逗号运算符的运算符,它很简单x, y
,其中 x 和 y 可以是任何表达式(理想情况下是相互兼容的类型——例如,两个数字)。
逗号运算符首先计算左边的表达式,然后计算右边的表达式,然后它自己计算右边的表达式。
74,2
首先计算表达式74
,然后计算表达式2
,然后计算为2
。因此,您将2
(an int
,根据需要自动转换) 分配给变量。
将其与文字数字一起使用似乎有点愚蠢,但确实如此。逗号运算符的存在是为了与具有副作用的表达式一起使用,例如涉及++
and--
运算符的表达式。
通常不鼓励使用逗号运算符,因为生成的代码不清楚:通常,每一行应该做一件事,但一行如x = ++y, --z;
做三件事。
尽管如此,正如您发现的那样,它是有效的。但是,如果您打开了“未使用值”警告(您应该这样做),您应该会收到一个警告,因为实际上一半的表达式是未使用的——您将其丢74
在地板上。无害,但表明这不是您的本意。
你想要的是:
floatCountries = 74.2;