Swift子类初始化函数中调用父类初始化函数的正确位置

Swift子类初始化函数中调用父类初始化函数的位置与Objc中的惯例不同。

按照以往使用OBJC的编程方法,super.init函数是在一进入时就首先调用的,但这在Swift中会报语法错误
//继承
class Student: Person {
var num: Int

init(name: String, sex: String, age: Int, num: Int) {
self.num = num
super.init(name: name, sex: sex, age: age)
// self.num = num

}
//重写父类方法需要使用 override 关键字标注
overridefunc description () -> () {

println("self.name = \(self.name),self.sex = \(self.sex),self.age = \(self.age),self.num = \(self.num)")
}
}

出错的原因是父类的init函数中调用了被子类所覆盖的函数,而编译器发现子类此时还没有完成初始化,这种情况下正确的方法是最后调用父类的初始化init函数


1、自定义初始化方法要先调用自己类默认初始化方法,自己重写默认初始化方法要先调用父类默认初始化方法

2、应该要先调用父类的构造器或者自身的默认构造器,以防止先给属性赋值了然后才调用父类或者自身的默认构造器把以前的赋值覆盖了

一个类的所有存储属性-包括从父类继承而来的属性-都必须在初始化的时候设置初始值。

Swift为class类型定义了两种构造器来确保它们所有的存储属性都设置了初始值。这两种方式叫做指定构造器和便捷构造器。

指定构造器和便捷构造器

指定构造器是一个类最主要的构造器。指定构造器通过设置所有属性的初值并且调用所有的父类构造器来根据构造链一次初始化所有的属性。

类所拥有的指定构造器很少,一般只有一个,并且是连接这父类的构造链依次完成构造的。

每个类至少有一个指定构造器,在有些情况下,需要使用继承来从父类中得到该指定构造器,更多内容可以查看后面的Automatic Initializer Inheritance章节。

便捷构造器是类的第二种常用构造器。你可以调用同一个类中的指定构造器来定义一个便捷构造器,使用指定构造器来设置相关的参数默认值。你还可以定义一个便捷构造器来创建这个类的实例或者是别的特殊用途。

如果你的类不需要它们,也可以不定义便捷构造器。不过对于常见初始化模型需要快捷方式的时候创建一个便捷构造器可以让你的初始化过程变成十分简单便捷。

构造链

为了简化指定构造器和便捷构造器的关系,Swift为两种构造器的代理调用设置了三个规则:

规则1

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

规则2

便捷构造器只能调用同一个类中的其它构造器

规则3

便捷构造器必须以调用一个指定构造器结束

记下这些规则的简单方法是:

指定构造器必须向上代理

便捷构造器必须横向代理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值