为什么在Objective-C中为每个对象变量声明类型?

为什么在Objective-C中为每个对象变量声明类型?,objective-c,Objective C,既然Objective-C是一种动态类型语言,为什么我们仍然需要类型? 原因是因为它与C代码混合在一起吗?Objective-C与C不混合,有些是 您可以避免在任何Objective-C对象变量上使用静态类型,并将所有内容声明为id,但我不明白您为什么要这样做。由于类型信息(提供或推断),您将失去编译器提供给您的所有帮助 总而言之,你不需要类型,你需要类型。Objective-C是C的一个合适的超集,因为它可以做C所能做的一切,等等。最初,Objective-C是在任何C编译器上编译的C的扩展

既然Objective-C是一种动态类型语言,为什么我们仍然需要类型?
原因是因为它与C代码混合在一起吗?

Objective-C与C不混合,有些是

您可以避免在任何Objective-C对象变量上使用静态类型,并将所有内容声明为
id
,但我不明白您为什么要这样做。
由于类型信息(提供或推断),您将失去编译器提供给您的所有帮助


总而言之,你不需要类型,你需要类型。

Objective-C是C的一个合适的超集,因为它可以做C所能做的一切,等等。最初,Objective-C是在任何C编译器上编译的C的扩展


类型既可以帮助程序员,也可以帮助描述语言语义。它们可以防止错误,并可以提高应用程序的性能,因为运行时系统不必如此努力地工作。

请看,它不仅与C代码混合在一起,而且是C代码的严格超集。理论上,您可以将所有代码都编码为
id
,但您很快就会感到困惑。(Objective-C确实是强类型和duck类型的奇妙结合。这是一个奇怪的怪兽。)你基本上是正确的——当你使用静态类型(而不是提示Objective-C预处理器以避免警告消息)时,你使用的是C,而不是Objective-C扩展。Objective-C本身不需要(甚至不使用)静态类型(尽管静态类型有助于避免编码错误和一般混淆)。唯一的例外是Objective-C调用中的标量参数(尽管有人可能会认为这是C,而不是Objective-C,因为PARM基本上是通过预处理器传递的);如果没有对象的强类型化,编译时错误会变成运行时错误,通常在运行时由[潜在]客户控制。。。。弱类型语言在构建复杂应用程序方面很糟糕。@bbum-我不会说得那么强烈,但你有一个观点。我不会确切地称Objective-C为C的“超集”。它是一种通过某种宏处理器实现的SmallTalk风格的语言,在C上运行。你仍然可以“到达”C是一种巧合(虽然开发人员利用它来避免完全实现“来宾”语言的需要)C是它的超集的真正原因。它不包含C,它包含它。从Wiki中可以编译任何一个带有ObjuleC编译器的C程序,并且可以在ObjuleC类中自由地包含C代码。相关:@ CurrCikes不像C++,ObjuleC是C的超集。静态类型信息可以增加ObjytoC的性能吗?ple将处于迭代构造中。运行时系统必须在每次迭代中检查当前关联的变量类型是否可以与布尔运算符一起使用。我真的不知道您描述的是哪种场景/语言,但对于Objective-C肯定不是这样。它的后期绑定意味着在发送的每个消息上该方法的实现正在再次从选择器中解决。基本上,当您使用静态类型时,您使用的是C,而不是Objective-C。静态类型最多只能提示Objective-C预处理器生成警告消息,说明某个方法可能不可用。