XZ_Swift之Swift面向对象

来源:互联网 发布:家庭相册制作软件 编辑:程序博客网 时间:2024/05/25 01:35

Swift面向对象
1、关于命名空间
在 Swift 中,默认同一个项目中,所有的类都是共享的,可以直接访问,不需要 import
所有对象的属性 var,也可以直接访问到
在Swift中,所有类都默认有一个命名空间,就是项目名称
同一个Person类,从属于不同的命名空间!
OC定义类的时候,会有前缀:NS、XZ、WY…

2、必选属性的构造函数
2.1构造函数的执行顺序
a.构造函数的目的:给自己的属性分配空间并且设置初始值
b.调用父类构造函数之前,需要先给本类属性设置初始值
c.调用父类的‘构造函数’,给父类的属性分配空间设置初始值
NSObject 没有属性,只有一个成员变量 ‘isa’

3、在定义类并且初始化的时候可能会遇到的问题
3.1 Class ‘Person’ has no initializers
‘Person’ 类没有 ‘初始化器s’,构造函数,可以有多个,默认的是 init
3.2 Overriding declaration requires an ‘override’ keyword
重‘写’ -> 父类有这个方法,子类重新实现,需要 override 关键字
3.3 Property ‘self.name’ not initialized at super.init call
在调用父类 super.init 的时候,没有给 self.name 初始化 -> 分配空间,设置初始值!

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

5、重载和重写的区别
5.1 重载 overload 的概念
-函数名相同
-参数类型和个数不同
-重’载’:好处 - 可以从外部给自己的属性设置初始值
-OC 没有重载,都是initWithXXX
-如果重载了构造函数,并且没有实现父类的 init 方法,系统不再提供 init() 构造函数(默认是会有的!) — 因为默认的构造函数,不能给本类的属性分配空间!

5.2 重写 override 的概念
-父类存在相同的方法
-子类重新编写父类的方法的实现

构造函数的作用
-分配空间 alloc
-设置初始值 init

// 实例化 person// () -> alloc/init// Swift 中对应一个函数 init() 构造函数// 作用:给成员变量分配空间,初始化成员变量let p = Person()print(p.name)
// 先定义一个 Person 类继承自 NSObject,然后定义一个 Student 类继承自 Person,在 Person 类的 init 方法中,打印 ‘person init’,在 Student 类的 init 方法中,打印 ‘student init’,在控制器中定义以下代码:let s = Student()print(s.name + "-----" + s.no)打印的结果是:student init person init  张三-----101  

说明调用的顺序是,显示当前类的init方法,然后是父类Person的init方法,然后是父类NSObject的init方法

下图很好的诠释了构造函数的作用
这里写图片描述

小结
-非 Optional 属性,都必须在构造函数中设置初始值,从而保证对象在被实例化的时候,属性都被正确初始化
-在调用分类构造函数之前,必须保证本类的属性都已经完成初始化
-Swift 中的构造函数不用写 func
-Override 重写:-父类存在相同的方法,子类重新编写父类方法的实现。

// Person 类 重载 构造函数    var name:String    init(name:String) {        // 使用参数的 name 设置给属性        self.name = name        // 调用父类的构造函数        super.init()    }// Student 类 重载 构造函数// 学号    var no:String    init(name: String,no: String) {        self.no = no        // 调用父类方法,给 name 初始化        super.init(name: name)    }

重载构造函数
Swift中支持函数重载,同样的函数名,不一样的参数类型
// 如果希望在创建对象时,直接为属性设置需要的数值,可以重载构造函数
init(name:String) {
self.name = name
super.init()
}

调用构造函数
// 一旦重载了构造函数,系统不再提供默认的 ’( )’ 构造函数
// let p = Person( )
// 使用重载的构造函数创建对象,并且设置指定值
let p = Person(name: “张三”)

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