博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift 类构造器的使用
阅读量:5236 次
发布时间:2019-06-14

本文共 1208 字,大约阅读时间需要 4 分钟。

Swift 中构造器需要遵循的规则还是很多的, 总结一下, 有以下规则:

  调用相关

    指定构造器必须调用它直接父类的指定构造器方法.

    便利构造器必须调用同一个类中定义的其它初始化方法.

    便利构造器在最后必须调用一个指定构造器.

  属性相关

    指定构造器必须要确保所有被类中提到的属性在代理向上调用父类的指定构造器前被初始化, 之后才能将其它构造任务代理给父类中的构造器.

    指定构造器必须先向上代理调用父类中的构造器, 然后才能为任意属性赋值.

    便利构造器必须先代理调用同一个类中的其他构造器, 然后再为属性赋值.

    构造器在第一阶段构造完成之前, 不能调用任何实例方法, 不能读取任何实例属性的值,self 不能被引用.

  继承相关

     如果子类没有定义任何的指定构造器, 那么会默认继承所有来自父类的指定构造器.

  •   如果子类提供了所有父类指定构造器的实现, 不管是通过上一条规则继承过来的, 还是通过自定义实现的, 它将自动继承所有父类的便利构造器.
  • 父类中,定义了一个 制定构造器,加上required后:
  • 1
    2
    3
    4
    5
        
    class
    SomeClass {
        
    required init() {
        
    // initializer implementation goes here
        
    }
    }

    表示:

    子类中必须要实现这个required init

    并且子类的写法,也是:

    1
    2
    3
    4
    5
        
    class
    SomeSubclass: SomeClass {
        
    required init() {
        
    // subclass implementation of the required initializer goes here
        
    }
    }

    而不是写override

    同时,子类的子类,也必须要实现这个required init。

    所以此处的required init,就只是继承实现了父类的required init而已。

    暂时无需太关心。

总结】

至此,基本明白了:

1
2
3
init() {
    
super.init(nibName: nil, bundle: nil)
}

是当前子类的制定构造器。

并且要在初始化子类自己的所有的变量之后,再去调用父类的init。

具体的init的参数,取决于所继承的父类(可以通过看父类的源码而得知)

以及初始化参数,一般无需太操心时,往往都是nil

1
2
3
required init?(coder aDecoder: NSCoder) {
    
super.init(coder: aDecoder)
}

是实现了,父类中的required init而已。

其内部实现,继续只是调用父类的init而已。没啥特殊的。

转载于:https://www.cnblogs.com/xilanglang/p/5072392.html

你可能感兴趣的文章
ARTS打卡第3周
查看>>
linux后台运行和关闭SSH运行,查看后台任务
查看>>
cookies相关概念
查看>>
CAN总线波形中ACK位电平为什么会偏高?
查看>>
MyBatis课程2
查看>>
桥接模式-Bridge(Java实现)
查看>>
svn客户端清空账号信息的两种方法
查看>>
springboot添加servlet的两种方法
查看>>
java的Array和List相互转换
查看>>
layui父页面执行子页面方法
查看>>
如何破解域管理员密码
查看>>
Windows Server 2008 R2忘记管理员密码后的解决方法
查看>>
IE11兼容IE8的设置
查看>>
windows server 2008 R2 怎么集成USB3.0驱动
查看>>
Foxmail:导入联系人
查看>>
vue:axios二次封装,接口统一存放
查看>>
vue中router与route的区别
查看>>
js 时间对象方法
查看>>
网络请求返回HTTP状态码(404,400,500)
查看>>
Spring的JdbcTemplate、NamedParameterJdbcTemplate、SimpleJdbcTemplate
查看>>