# 构造函数基础

作者: MarkusFeng | 来源:发表于2015-12-17 15:14 被阅读43次

构造函数是一种特殊的函数,主要用来在创建对象时初始化对象,为对象成员变量设置初始值,在 OC 中的构造函数是 initWithXXX,在 Swift 中由于支持函数重载,所有的构造函数都是 init

构造函数的作用

  • 分配空间 alloc
  • 设置初始值 init

必选属性

  • 自定义 Person 对象
class Person: NSObject {

    /// 姓名
    var name: String
    /// 年龄
    var age: Int
}

提示错误 Class 'Person' has no initializers -> 'Person' 类没有实例化器s

原因:如果一个类中定义了必选属性,必须通过构造函数为这些必选属性分配空间并且设置初始值

  • 重写 父类的构造函数
/// `重写`父类的构造函数
override init() {
    
}

提示错误 Property 'self.name' not initialized at implicitly generated super.init call -> 属性 'self.name' 没有在隐式生成的 super.init 调用前被初始化

  • 手动添加 super.init() 调用
/// `重写`父类的构造函数
override init() {
    super.init()
}

提示错误 Property 'self.name' not initialized at super.init call -> 属性 'self.name' 没有在 super.init 调用前被初始化

  • 为比选属性设置初始值
/// `重写`父类的构造函数
override init() {
    name = "张三"
    age = 18
    
    super.init()
}

小结

  • 非 Optional 属性,都必须在构造函数中设置初始值,从而保证对象在被实例化的时候,属性都被正确初始化
  • 在调用父类构造函数之前,必须保证本类的属性都已经完成初始化
  • Swift 中的构造函数不用写 func

子类的构造函数

  • 自定义子类时,需要在构造函数中,首先为本类定义的属性设置初始值
  • 然后再调用父类的构造函数,初始化父类中定义的属性
/// 学生类
class Student: Person {

    /// 学号
    var no: String
    
    override init() {
        no = "001"
        
        super.init()
    }
}

小结

  • 先调用本类的构造函数初始化本类的属性
  • 然后调用父类的构造函数初始化父类的属性
  • Xcode 7 beta 5之后,父类的构造函数会被自动调用,强烈建议写 super.init(),保持代码执行线索的可读性
  • super.init() 必须放在本类属性初始化的后面,保证本类属性全部初始化完成

Optional 属性

  • 将对象属性类型设置为 Optional
class Person: NSObject {
    /// 姓名
    var name: String?
    /// 年龄
    var age: Int?
}
  • 可选属性不需要设置初始值,默认初始值都是 nil
  • 可选属性是在设置数值的时候才分配空间的,是延迟分配空间的,更加符合移动开发中延迟创建的原则

相关文章

  • Swift构造函数和便利构造函数

    [转]Swift构造函数和便利构造函数 构造函数基础 构造函数是一种特殊的函数,主要用来在创建对象时初始化对象,为...

  • 关于构造函数Array属性和方法总结

    @(JavaScript基础) 关于构造函数Array属性和方法总结 构造函数Array属性: Array.len...

  • 原型链经典面试题

    命题点一:原型基础 + 构造函数基础 命题点二:自有属性与原型继承属性 命题点三:构造函数综合考察

  • # 构造函数基础

    构造函数是一种特殊的函数,主要用来在创建对象时初始化对象,为对象成员变量设置初始值,在 OC 中的构造函数是 in...

  • JavaScript构造函数

    在JavaScript编程中,构造函数是面向对象编程的基础。创建构造函数和普通函数一样,也是使用function关...

  • 第2章 类和对象

    2.1 类的基础知识2.2 构造函数2.3 拷贝构造函数2.4 析构函数2.5 C++能自动产生成员函数2...

  • Swift 2 学习笔记 14.继承和构造函数

    课程来自慕课网liuyubobobo老师 继承和构造函数 继承基础 多态性 重载 两段式构造 便利构造函数和指定构...

  • Java基础 --- 构造函数

    1 概述 1-1 为什么会出现构造函数(作用) 对象不初始化,没办法使用,构造函数的作用,就是给对象进行初始化 ...

  • swift基础-构造函数

    一,如果是继承自NSObject,可以对父类的构造函数进行重写 最后需要注意的点:自定义构造函数,如果没有重写默认...

  • Dart基础: 构造函数

    Dart基础: 构造函数 Dart的构造函数比较变化多端, 我们可以在不同的场景下合理声明和调用一个class的构...

网友评论

    本文标题:# 构造函数基础

    本文链接:https://www.haomeiwen.com/subject/kwrphttx.html