Objective C cast(id)vs cast作为显式类

Ric*_*ble 2 objective-c

通常在目标C中,您知道对象是一种特定的类,因此您将其强制转换为该类以继续使用它:

NSObject *object;
NSString *string = (NSString *)object;
Run Code Online (Sandbox Code Playgroud)

但是,这已经困扰了我一段时间 - 在该演员阵容中写出"NSString*"与短片(id)相比有什么好处:

NSObject *object;
NSString *string = (id)object;
Run Code Online (Sandbox Code Playgroud)

我通常喜欢详细的Objective-C,因为该语言是为了可读性而设计的,但在这种情况下我无法弄清楚任何冗长的优点.

bbu*_*bum 6

您可以采取任何措施为编译器提供有关正在运行的类型的更精确和准确的信息,编译器可以验证您的代码.该id类型基本上意味着*这件事回应我见过declared`的编译器,其中一个具体的投它缩小到只有类支持方法的任何方法.

通常,应避免使用演员表.它们通常表明结构不佳.但并不总是如此,因为在动态生成UI或解析JSON时它们是不可避免的.

在这种情况下,一个归结为这个的构造是有帮助的:

NSObject *object;
NSAssert((!object) || [object isKindOfClass:[NSString class]]);
NSString *string = (NSString *)object;
Run Code Online (Sandbox Code Playgroud)

这迫使对我的验证比编译器更好地了解运行时.(并且,是的,它明确允许nil在这种情况下通过....您的具体需求可能会有所不同.)