面向对象

目标

  • 构造函数

    • 构造函数的基本概念
    • 构造函数的执行顺序
    • KVC 在构造函数中的使用及原理
    • 便利构造函数
    • 析构函数
    • 区分 重载 和 重写
  • 懒加载
  • 只读属性(计算型属性)
  • 设置模型数据(didSet

构造函数基础

构造函数是一种特殊的函数,主要用来在创建对象时初始化对象,为对象成员变量设置初始值,在 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 中支持函数重载,同样的函数名,不一样的参数类型
/// `重载`构造函数
///
/// - parameter name: 姓名
/// - parameter age: 年龄
///
/// - returns: Person 对象
init(name: String, age: Int) {
self.name = name
self.age = age super.init()
}

注意事项

  • 如果重载了构造函数,但是没有实现默认的构造函数 init(),则系统不再提供默认的构造函数
  • 原因,在实例化对象时,必须通过构造函数为对象属性分配空间和设置初始值,对于存在必选参数的类而言,默认的 init() 无法完成分配空间和设置初始值的工作

调整子类的构造函数

  • 重写父类的构造函数
/// `重写`父类构造函数
///
/// - parameter name: 姓名
/// - parameter age: 年龄
///
/// - returns: Student 对象
override init(name: String, age: Int) {
no = "002" super.init(name: name, age: age)
}
  • 重载构造函数
/// `重载`构造函数
///
/// - parameter name: 姓名
/// - parameter age: 年龄
/// - parameter no: 学号
///
/// - returns: Student 对象
init(name: String, age: Int, no: String) {
self.no = no super.init(name: name, age: age)
}

注意:如果是重载的构造函数,必须 super 以完成父类属性的初始化工作

重载重写

  • 重载,函数名相同,参数名/参数类型/参数个数不同

    • 重载函数并不仅仅局限于构造函数
    • 函数重载是面相对象程序设计语言的重要标志
    • 函数重载能够简化程序员的记忆
    • OC 不支持函数重载,OC 的替代方式是 withXXX...
  • 重写,子类需要在父类拥有方法的基础上进行扩展,需要 override 关键字

Swift 入门之简单语法(五)的更多相关文章

  1. Swift 入门之简单语法(六)

    KVC 字典转模型构造函数 /// `重写`构造函数 /// /// - parameter dict: 字典 /// /// - returns: Person 对象 init(dict: [Str ...

  2. Swift 入门之简单语法(四)

    函数 目标 掌握函数的定义 掌握外部参数的用处 掌握无返回类型的三种函数定义方式 代码实现 函数的定义 格式 func 函数名(行参列表) -> 返回值 {代码实现} 调用 let result ...

  3. Swift 入门之简单语法(二)

    可选项判断 由于可选项的内容可能为 nil,而一旦为 nil 则不允许参与计算 因此使用中,经常需要判断可选项的内容是否为 nil 单个可选项判断 let url = NSURL(string: &q ...

  4. Swift 入门之简单语法(一)

    定义 let 定义常量,一经赋值不允许再修改 var 定义变量,赋值之后仍然可以修改 //: # 常量 //: 定义常量并且直接设置数值 let x = 20 //: 常量数值一经设置,不能修改,以下 ...

  5. Swift 入门之简单语法(三)

    集合 数组 数组使用 [] 定义,这一点与 OC 相同 //: [Int] let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 遍历 for num in nu ...

  6. Swift入门教程:基本语法(五)

    断言 断言是一种实时检测条件是否为true的方法 如果条件为true,那么代码继续执行 如果条件为false,就抛出错误信息,直接终止程序的运行   断言的用法 使用全局的assert函数 passe ...

  7. Swift入门教程:基本语法大全

    原文:Swift入门教程:基本语法大全       简介:                                                                        ...

  8. Swift入门教程:基本语法(一)

          简介:                                                                                       什么是S ...

  9. swift入门-day01-基本语法

    主要内容: 1.常量和变量 2.Optional 3.控制流 4.循环 5.字符串 6.集合 变量和常量 定义 let 定义常量,一经赋值不允许再修改 var 定义变量,赋值之后仍然可以修改 自动推导 ...

随机推荐

  1. sqlplus连接oracle问题

    第一次在自己电脑上连接远端数据库,尝试了一上午居然还没成功,后来在网上找了一堆的方法终于是连接上了    -_-!! 总结一下:简单操作:一步到位 我主要是用的oracle 11g的数据库,sqlpl ...

  2. jQuery控制元素隐藏和显示

    1.jQuery隐藏和显示效果 通过 jQuery,您可以使用 hide() 和 show() 方法来隐藏和显示 HTML 元素: $("#hide").click(functio ...

  3. 基于bootstrap的bootstrap-editable插件实现即时编辑功能

    1.引用基本css和js: <link href="bootstrap3/css/bootstrap.min.css" rel="stylesheet" ...

  4. npm详解

    一.npm介绍及安装 对于npm,大家多多少少都用过,作为一门技术,我想写篇博客记录一下,一起分享,一起学习. npm,是Node Package Manager的缩写,node的模块管理器,它是随同 ...

  5. C++ struct 初始化的问题

    struct student { int age; string name; int id; }; 初始化: student st1={10, "li ming", 01}; 修改 ...

  6. TomCat杀进程

    有时候当你的tomcat启动时会发现 因为报以下的错误: "Several ports ( 8080, 8009) required by Tomcat v6.0 Server at loc ...

  7. Struts2框架的基本使用(三)

    上篇 Struts2框架的基本使用(二)介绍了Action和result的相关配置操作,本篇接着介绍剩下的异常处理机制和Convention插件的使用.下篇文章介绍的是Struts2框架中标签库的使用 ...

  8. Layui的一点小理解(上)

    首先声明这是个人的一点理解,如有不对之处请指正,以下的例子有在官网上看到的,有的是自己写的.还是老规矩最后会附上官网的,如有不明白之处,请查看文档或留言. 既然说Layui,当然要简单的介绍以下什么是 ...

  9. 关于在"a"标签中添加点击事件的一些问题

    昨天做修改页面跳转时遇到一个问题,如果a标签的"href"属性为空的话,比如这样<a href="" onclick="roleupdate() ...

  10. 编写高质量的JavaScript代码(一)

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 2016年6月加入腾讯,目前在SNG社交网络质量部从事内部平台工具的研发.熟悉PHP.JS.CSS,喜欢弹吉他 ...