尝试为 NSError 设置本地化描述时代码崩溃

Posted

技术标签:

【中文标题】尝试为 NSError 设置本地化描述时代码崩溃【英文标题】:Code crashes when trying to set a localized description for an NSError 【发布时间】:2012-03-06 10:28:20 【问题描述】:

如果出现问题,我正在尝试设置错误消息,但我得到了

This class is not key value coding-compliant for the key NSLocalizedDescription

这是我使用的代码

-(id)getMoneyFromAccount:(int) sum error:(NSError **)error

    if(self.balance - sum < 0)
    
        NSDictionary *details = [NSDictionary dictionary];
        [details setValue:@"You don't have enough money" forKey:NSLocalizedDescriptionKey];
        *error = [NSError errorWithDomain:@"money" code:200 userInfo:details];
        return nil;
    
    self.balance = self.balance - sum;
    return  [NSNumber numberWithInt:self.balance];

【问题讨论】:

【参考方案1】:

你打电话给setValue:forKey:,你应该打电话给setObject:forKey:

[details setObject:@"You don't have enough money" forKey:NSLocalizedDescriptionKey];

另外,你必须从NSDictionary 更改为NSMutableDictionary 或者设置初始化器中的值:

NSDictionary *details = [NSDictionary
    dictionaryWithObject:@"You don’t…"
    forKey:NSLocalizedDescriptionKey];

setValue:forKey: 可以使用可变字典,但最好直接调用 setObject:forKey:

【讨论】:

当我按照您的建议更改代码时,我得到“NSDictionary 可能无法响应 setObject:forKey” 是的,我想念您使用的是普通的、不可变的字典。我已经编辑了答案,现在代码必须工作。【参考方案2】:

当您需要更改已初始化的 NSError 的本地化描述时,您可以重写 NSError 类,如下所示:

@interface ValidationError : NSError

@property (nonatomic, strong) NSString *localizedDescription;
@end

【讨论】:

【参考方案3】:

不,setValue: forKey: 是正确的使用方法。也许这是因为您需要创建 NSMutableDictionary 而不是 NSDictionary。

【讨论】:

不使用 NSDictionary(不可变) 我不明白你在说什么?你总是可以用 [NSDictionary dictionaryWithDictionary:mutableDictionary] 得到一个 NSDictionary;来自可变字典。 他正在回复你的第一句话,NSDictionary 不会使用 NSLocalizedDescription 键回复 setValue:forKey: @Ganzolo:正确,我没有阅读第二个。但是,您的陈述也是不正确的,因为您应该使用 setObject:ForKey: 为什么? NSLocalizedDescription 是 NSString。 setValue forKey 取 NSStrings 作为键。【参考方案4】:

您需要使用 NSMutableDictionary 或初始化程序来设置值。 NSDictionary 初始化后无法更改。

NSDictionary* details = [NSDictionary dictionaryWithObject: @"..." 
                                                    forKey: NSLocalizedDescriptionKey];

【讨论】:

以上是关于尝试为 NSError 设置本地化描述时代码崩溃的主要内容,如果未能解决你的问题,请参考以下文章

NSError 奇怪的问题 - 尝试访问 NSError 的属性时应用程序崩溃

Swift 3.1:自定义错误转换为 NSError 以访问其域属性时崩溃

NSString 失败,应用程序崩溃尝试 NSLog NSError

从 Cloudkit 加载空属性时代码崩溃 - 使用 Swift

NSError 为 nil 但进入非 nil 状态

当我分配 NSError userInfo 来设置 NSDictionary 时,为啥我的应用程序会崩溃?