在Objective-C中,我经常看到返回动态类型对象的方法,如下所示:
- (id)someMethod:(id)someParameter;
我知道我也可以这样做:
- someMethod:someParameter;
有趣的是,我在更多核心级别的基础课程中看到了后一种惯例,但其他人似乎都使用了第一种。由于Objective-C运行时推断出无类型的方法或参数将返回id
,为什么要包含它?它不会破坏阅读的流程吗?
我不仅想知道开发人员在考虑使用这个约定时可能出现的问题,还想知道你们是否认为这很简单?
答案 0 :(得分:5)
由于语言允许两种形式,它真的是一种风格。鉴于此,Objective-C在很大程度上依赖于可读性而不是简洁性,并且大多数开发人员更喜欢第一个(-(id)someMethod
),因为它明确了返回类型。
与您的问题不直接相关,但id
不是动态输入的。它是指向Objective-C对象的指针。由于消息调度在Objective-C中是动态的,id
通常可以被视为动态类型,但它实际上仍然是静态类型。换句话说,Objective-C是动态绑定但是静态类型。
答案 1 :(得分:2)
首先,我相信编译器会推断出类型,而不是运行时。
我认为第二个约定来自于Objective-C的深层面向对象。大多数代码都是为了处理对象,因此默认的返回类型和参数类型是id
。这样做的便利是编译器不关心是否声明对象的特定类型,只要您在其上使用的方法存在某处。
最大的潜在问题是将消息发送到它没有响应的对象,因为你不小心认为它是另一种类型的对象。这就是为什么你不应该留下类型,而是使用最具体的类型。
我想说第二个约定对于使用语言和运行时的大量动态特性而非灵活性的代码来说只是一个好主意,而不是在制作应用程序时大多数时候会遇到的特定对象和类。 。在适当的地方使用第一个约定会提高可读性并使错误变得更加困难。这是一个语义问题 - 尽可能具体地说明你的类型会遗漏误解的可能性,并且可以帮助你编写更好的代码。
答案 2 :(得分:1)
很多NeXT时代的代码遵循这样的惯例,即将(id)
排除在返回类型之外,并且大部分代码都会转移到OS X中。当代码排除类型并保存时,我发现它很混乱无论如何,现在4-5个字符毫无意义。我的猜测是老习惯很难 - 我的经验是最好的做法是始终包括返回类型。它确实使语言的新手更清楚,并且做出更少的假设。