代码之家  ›  专栏  ›  技术社区  ›  Jonathan Sterling

使用`id'的键入方法`

  •  2
  • Jonathan Sterling  · 技术社区  · 16 年前

    在Objective-C中,我通常看到返回动态类型对象的方法,定义如下:

    - (id)someMethod:(id)someParameter;
    

    不过,我知道我也能做到这一点:

    - someMethod:someParameter;
    

    id ,我为什么要包括它?这不是破坏了阅读的流程吗?

    我想知道的不仅是开发人员在考虑使用这个约定可能出现的问题,还有你们是否认为这很奇怪?

    3 回复  |  直到 16 年前
        1
  •  5
  •   Barry Wark    16 年前

    由于语言允许两种形式,这实际上是一个风格问题。有鉴于此,Objective-C严重依赖可读性而非简洁性,大多数开发人员更喜欢第一种( -(id)someMethod )因为它使返回类型显式。

    与您的问题不直接相关,但 id 不是动态类型的。它是指向Objective-C对象的指针。由于Objective-C中的消息调度是动态的, 身份证件 通常可以被视为动态类型,但实际上仍然是静态类型。换句话说,Objective-C是动态的 跳跃

        2
  •  2
  •   jtbandes    16 年前

    首先,我相信是编译器推断了类型,而不是运行时。

    我相信第二个约定来自Objective-C的深层面向对象特性。大多数代码都是用来处理对象的,因此默认的返回类型和参数类型是 id . 这样做的方便之处在于,只要对象上使用的方法存在,编译器就不关心是否声明对象的特定类型 在某处 .

    最大的潜在问题是将消息发送到它没有响应的对象,因为您意外地认为它是另一种类型的对象。这就是为什么不应该省略类型,而应该使用最具体的类型。

        3
  •  1
  •   Quinn Taylor    16 年前

    很多下一个时代的代码遵循了排除 (id) 对于返回类型,大部分代码都被带到了OSX中。当代码排除了该类型时,我发现这很混乱,而且现在保存4-5个字符是毫无意义的。我的猜测是,旧习惯很难改掉。我的经验是,最好的做法是始终包含返回类型。对于语言新手来说,这无疑会让事情变得更清楚,并且做出更少的假设。