我有字典。我提取其值之一,如下所示:
NSString *magicValue= [filterDict valueForKey:[filterDict allKeys][0]];
[SomeClass foo: magicValue];
foo是:
- (void)foo:(NSString*)magicValue
{
NSLog("magicValue is string:%@",[magic isKindOfClass:[NSString class]] ? @"YES" : @"NO");
NSLog("magicValue is number:%@",[magic isKindOfClass:[NSNumber class]] ? @"YES" : @"NO");
}
如果字典值为数字,则magicValue将为NSNumber
。因此,定义的字符串指针将指向NSNumber
。日志将为数字检查返回“是”。
我从未对此类方法添加保护,以检查“ magicValue”是什么类。我假设当我使用字符串参数定义一个方法时,它将是字符串。
我应该开始考虑这种行为并始终添加检查,还是以这种方式将字典值分配给魔术并使用我的方法的家伙的错。我需要一些最佳做法建议以及如何处理。
这个问题可能已经回答了,但是我不知道如何搜索。
简短的回答:不,如果没有特殊原因,请不要检查。
长答案:
您必须区分两种情况:
A.使用 id
您有类型的变量或返回值id
。这就是您的示例-valueForKey:
。进行键入的原因是保持方法的通用性。即使从理论上讲也是可能的,但实际上这种情况下的类型不匹配非常少见,并且在开发中很快就被发现了。出于不同的动机,我在公开演讲中问观众(> 200),他们在制作中有多少次出现这种打字错误。对于所有侦听器,其所有应用程序所有版本中的所有应用程序均为1(换句话说:一个!)。只需忘掉这种风险即可。这是开发人员使用静态类型化语言(Java,C ++,Swift)的焦虑。
B.错误的分配
如果您没有id
类型,仍然可以进行这种技巧。(有时您想这样做。这是动态类型的优势。)有两个子类别:
您可以隐式地执行此操作:
NSString *string = [NSNumber numberWithInt:1];
编译器会警告您。所以一切都很好,因为开发人员将看到他的错误。您不必保护他或您的代码。
一个人可以明确地做到这一点:
NSString *string = (NSString*)[NSNumber numberWithInt:1];
在这种情况下,代码可能会中断。但是他明确地做到了。如果是错的话,那么开发商就有犯罪的力量去做,而您不必保护他免受自己的侵害。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句