当开发人员忘记在LocalizedStrings中输入密钥时,我需要触发自定义编译器错误,以便提醒他这会导致应用程序显示密钥而不是文本。我个人认为这是完美的,但我被要求启动编译错误,因为应用程序有很多情况,并在心不在焉的情况下保护开发人员。
假设接收密钥的方法类似于:
- (NSString *) localizedString:(NSString *)key {
HERE IS WHERE I WANT TO TRHROW THE COMPILER ERROR
}
答案 0 :(得分:4)
如果您想要编译时错误,请查看使用_Nonnull
注释参数:
-(NSString *)localizedString:(NSString * _Nonnull)key
...并使用-Wnullable-to-nonnull-conversion
打开-Werror
警告,将其变为错误。这里要处理的主要问题是现有代码的大量现在将因其他地方的可空到非空转换而失败,需要在整个源代码中增加注释。这可能不是一个可行的解决方案,但你至少可以调查它。
如果您只想在调试模式下出现运行时错误,请使用NSAssert
或NSParameterAssert
:
NSParameterAssert(key != nil);
// OR:
NSAssert(key != nil, "key must be non-nil");
// or just
NSAssert(key, "key must be non-nil");
如果您总是想要运行时错误,请使用@throw
或方便方法抛出异常:
if (!key) {
[NSException raise:@"MyException" format:@"key must be non-nil"];
}
答案 1 :(得分:0)
你可以这样使用。
-(NSString *) localizedString:(NSString *)key
{
if (key == nil || key == (id)[NSNull null])
{
NSException* myException = [NSException
exceptionWithName:@"NullException"
reason:@"You have passed null value in key"
userInfo:nil];
@throw myException;
}
else
{
}
}
答案 2 :(得分:0)
这里有两件事。 1.编译时间错误 2.运行时错误
您的构建将成功,因为语法没有问题。因此,这里不存在编译时错误。
您实际需要的是在即将构建应用程序时使构建失败的机制。
这可以通过使用构建阶段来实现。 去构建阶段。添加您的脚本,该脚本将在您的代码中查找键并检查.string文件中的相同键。基本上,当脚本失败时,您不会初始化构建过程