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( ) 无法完成分配空间和设置初始值的工作
- XZ_Swift之Swift面向对象
- XZ_Swift之Swift基础第一篇
- XZ_Swift之Swift基础第二篇
- Swift 之面向对象
- XZ_Swift之Swift中的错误/异常处理、反序列化
- Swift面向对象之枚举
- swift面向对象之属性
- swift面向对象之方法
- XZ_Swift之控制流
- XZ_Swift之! 、? 和 ?? 的区别
- swift面向对象详解
- Swift面向对象-枚举
- Swift:面向对象(属性)
- swift 面向对象
- Swift面向对象
- ios-Swift面向对象
- Swift学习笔记|Swift面向对象
- Swift OOP面向对象浅析
- HDOJ 2629 Identity Card
- radio发现有时无法回显
- 聚类(二)
- texlive or latex 文字超出边界的处理方法 “Overfull \hbox (pt too wide)”
- View Animation 视图动画全解
- XZ_Swift之Swift面向对象
- Android界面编程之Tabhost
- OkHttp源码解析
- fastjson学习
- Git(二)
- \pset 、\x命令
- GIS 地图投影
- HDOJ 2734 Quicksum
- java对象 声明 初始化 =null new() 总结