1.属性
属性区分为:存储属性 和 计算属性 swift创建实例对象要求必须所有存储属性有初始值
1.存储属性:
类似于成员变量,在实例对象中有内存
2.计算属性:
本质上就是方法(类似于OC 分类中添加属性, 生成对应的方法,但是并不会占用实例对象内存)
如果需要声明自读(readOnly)属性,只需要实现get方法即可
class TestClass {
/// 存储属性
var name : Int
/// 计算属性 (自动生成get set方法 set方法参数默认为:newValue)
var age : Int {
set{
}
get{
22
}
}
}
延迟存储属性
用lazy修饰存储属性,在初始化实例对象时用lazy修饰的属性并不是即时创建,但是还是必须有初始值,用lazy修饰的属性是在使用到这个属性的时候才会创建分配内存。
注意: 用lazy修饰的属性,只能使用var定义。
lazy var name : String = "shine"
属性观察器 (Property Observer)
类似于OC中的kvo,属性观察期只能使用于不被lazy修饰的存储属性,swift中直接在存储属性中实现willSet 和 didSet 方法
class Shine {
var money : Double {
willSet{
/// 默认参数 newValue
print(newValue)
}
didSet{
/// 默认参数 oldValue
print(oldValue, money)
}
}
}
~父类的属性观察器在自己的初始化器中赋值不会触发,但是在子类的初始化器中赋值会触发属性观察器
inout关键字
本质上就是地址传递
1.使用inout修饰的参数,如果有物理内存地址,且没有属性观察器,会直接修改该物理地址的值
2.对于其他情况,比如:计算属性, 属性观察期; 则采取的是copy In copy Out的操作,先把改值copy in到一块临时内存,经过处理后再copyOut到你写入的属性的内存中。
类型属性(Type Property)
·类似于OC的类对象的属性, 但是类型属性的内存地址在全局区,并不是在类对象的内存中
·只不过这个全局变量关联了类型
static var name: String = "shine"///必须有初始值
2.方法
方法的定义:方法分为实例方法(instance method)和类型方法(type method)基本等同于OC
实例方法(Instance Method)
通过对象调用
var name = "shine"
func printName() -> Void {
print(self.name)
}
类型方法(Type Method)
通过类型调用
static func printClassName() -> Void {
print(type(of: self))
}
3.下标(subscript)
subscript(index: Int) -> Void {
set{
}
get{
}
}
subscript可以没有set方法,但是必须有get方法
4.继承(Inheritance)
- 值类型不支持继承,只有类支持继承
- swift可以没有基类,没有基类,自己就是基类
- 子类可以重写父类的方法,下标,属性,需要加上override关键字
5.内存结构
swift的类的内存结构默认有16个字节,前8个字节存储类型信息,后8个字节存储引用计数相关信息,再往后才是存储属性的内存,并且64位系统对齐方式是16位
6.多态
父类的指针指向子类对象
- swift中的多态技术使用的是数据结构中的续表
7.初始化
- swift中的初始化分为两种,指定初始化,和便携初始化
class Animal {
var name : String = "大黄"
var age : Int = 7
// 指定初始化
init() {
}
// 便携初始化
convenience init(name: String, age: Int) {
// 内部必须调用指定初始化
self.init()
self.name = name
self.age = age
}
}
- 如果指定初始化器用require修饰,子类可以不重写任何初始化器,获取用require修饰指定初始化器
class Animal {
var name : String = "大黄"
var age : Int = 7
required init() {
super.init()
}
convenience init(name: String, age: Int) {
self.init()
self.name = name
self.age = age
}
}
class Dog: Animal {
var species: String = ""
required init() {
}
init(category : String) {
super.init()
}
}
- 可失败初始化器
class Person {
var name : String
init?(name: String) {
if name.isEmpty {
return nil
}
self.name = name
}
}
8.反初始化(deinit)
- 反初始化器,类似于OC中的dealloc
- 当实例对象释放内存是会调用实例对象的deinit方法
- 子类的deinit调用结束会调用父类的deinit
class Person {
deinit {
// person对象呗销毁
}
}
网友评论