寻找更好的方法来测试对象的类类型

时间:2010-12-22 15:27:57

标签: objective-c cocoa scripting-bridge

在使用Scripting Bridge和Excel时,当我得到单个单元格的值时,我不知道我将从单元格中获取什么类。到目前为止,单个单元格的范围返回NSStringNSNumber(多个单元格的范围始终返回NSArray,我需要从那里强制值)。在我的工作中,我通常只需要单元格的 string 值,因此要将单格范围的值强制转换为我需要的值,我这样做......

NSString *cellValue = [targetRange.value get];
if ([cellValue isKindOfClass:[NSString class]]) {
    cellValue = [targetRange.value get];
} else if ([cellValue isKindOfClass:[NSNumber class]]) {
    cellValue = [[targetRange.value get] stringValue];
}

我的问题在于第一行(我们暂时忽略第三行,因为我还在进行一些重构)。是否有更好的类可以捕获单元格的值来测试类的反对?最后三行很好,但我觉得这样做并不完全舒服;它似乎不直观但与NSObject一起感觉同样奇怪。

2 个答案:

答案 0 :(得分:4)

  

这似乎不直观,但与NSObject一起感觉同样奇怪。

在这种情况下,您可以使用id

  

id类型完全不受限制。除了它是一个对象之外,它本身不会产生关于对象的信息。

E.g:

id cellValue = [targetRange.value get];
NSString *stringValue = nil;
if ([cellValue isKindOfClass:[NSString class]]) {
    stringValue = cellValue;
} else if ([cellValue isKindOfClass:[NSNumber class]]) {
    stringValue = [cellValue stringValue];
}

请注意,在您的情况下,您可能只使用以下内容:

NSString *stringValue = [NSString stringWithFormat:@"%@", [targetRange.value get]];

答案 1 :(得分:1)

您是否在运行时检查对象的类是否“正常”或“正常”,并根据类别采取不同的行动?如果是这样,这是一个强调 - 这是使Objective-C如此强大的部分原因。

如果你问是否有更好的方法来确定一个对象的类,那么不,不是真的。我的意思是你可以直接比较类(==),但鉴于类集群,子类等,这并不总是明智的。