zoukankan      html  css  js  c++  java
  • instancetype

    这篇文章原来在用 Github Pages 搭建的博客上,现在决定重新用回博客园,所以把文章搬回来。

    在 OC 中,约定(convention)不仅仅是编码时的最佳时间,也是对编译器的隐式说明。

    比如,allocinit都返回id类型,然而在 Xcode 中,编译器要做类型检查。这是怎么做到的?

    在 Cocoa 中,有这么个约定:像allocinit这样的方法名,返回接受者类型的实例。这些方法叫做有一个关联的结果类型(related result type)。

    类的构造方法也返回id类型,但是却没有得到类型检查的益处,因为类构造方法没有遵从命名约定。

    看个例子:

    [[[NSArray alloc] init] mediaPlaybackAllowsAirPlay]; // ❗ "No visible @interface for `NSArray` declares the selector `mediaPlaybackAllowsAirPlay`"
    
    [[NSArray array] mediaPlaybackAllowsAirPlay]; // (No error)
    

    因为allocinit遵从命名约定,类型检查返回NSArray执行后边的操作。然而,等价的类构造方法array不遵从约定,被解释为id类型。

    id在不需要确保类型安全的情况下非常有用,但如果需要保证类型安全,id就没什么用了。

    有一个替代的方法,可以显式的声明返回类型(在前边的例子中是NSArray)。但是如果要子类化,这样写就不太好。

    这时编译器开始解决 OC 的类型系统的这种临界情况:

    instancetype是一个上下文相关的关键字,可以用于返回类型来表示一个方法返回一个关联的结果类型。如:

    @interface Person
    + (instancetype)personWithName:(NSString *)name;
    @end
    

    id类型不一样,id可以还可以用于函数参数,instancetype只能用于函数声明中的返回类型。

    使用instancetype,编辑器能正确的推断+personWithName:返回了一个Person的实例。

    译自:nshipster 的 instancetype 一文。

    文章版权归个人所有,转载时请在文章显眼位置给出本文链接。
  • 相关阅读:
    编写安全代码:小心使用浮点数
    编写安全代码:有符号数和无符号数的移位区别右移
    封装了 C# 矩阵计算类CMarix
    几种位操作办法
    百度地图 鼠标绘制图形判 重叠 相交 demo
    eclipse 鼠标变成十字
    五(一)、spring 声明式事务注解配置
    eclipse创建Dynamic Web Project时忘记选中生成web.xml
    tomcat 请求地址去掉项目名称方法
    mybatis java类型和 jdbc类型 对应关系
  • 原文地址:https://www.cnblogs.com/xjshi/p/7340633.html
Copyright © 2011-2022 走看看