objective-c - 基本的Objective-C类型转换问题

标签 objective-c ios casting nsstring

考虑以下代码:

if([obj isKindOfClass:[NSString class]])  {
   NSString *s = [(NSString *)obj stringByAppendingString:@"xyzzy"];
}

我在这里有点困惑。 if语句检查obj是否属于NSString类。如果是的话,它将对象和附加字符串分配给NSString *s,我能正确理解吗?如果是这样,为什么还要将其转换为(NSString *)if语句是否已经检查过,并且不需要进行类型转换?

只说一句不是很好吗?
NSString *s = obj stringByAppendingString:@"xyzzy"];
提前致谢。

最佳答案

这完全取决于obj的定义方式。如果是id obj,则不需要强制转换,但是如果将其定义为NSObject *obj,则必须强制执行强制转换以禁止编译器警告stringByAppendingString:上未定义NSObject。不需要强制转换来使代码在运行时工作,它只告诉编译器“正确”的类型,因此可以告诉该方法是否应存在于对象上。
id不需要强制类型转换的原因是,id表示“任何类型的对象”,而NSObject *表示“NSObject类型的对象”。

关于objective-c - 基本的Objective-C类型转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6399188/

相关文章:

ios - 检查字符串是否是 const 结构成员的更好方法是什么?

ios - iOS 版 UIBarButtonItem-角标(Badge)

ios - 使用 mergeChangesFromContextDidSaveNotification 时 CoreData 无法完成错误

c - 在 g_malloc() 之后分配给 uint* 时为 "invaiid operands to binary *"

c# - 如何将对象转换为它自己的类型?

iphone - 限制 NSTableView 列中单元格中的文本长度

ios - 代码 : How to Add Left and Right Padding on Text Field?

objective-c - NSTextField - *textField 内的操作

c# - 什么时候应该使用隐式转换?

objective-c - 如何在 Cocoa 中进行异步 Web 服务调用