一、方法:
1、类是由 属性 与 方法 组成。在枚举、结构体、类内部定义的。分为 实例方法 与 静态方法
- 调用方式:
实例方法--实例名.方法名
静态方法--类型名称.方法名
// 注:函数的调用不需要调用者
2、可变方法
结构体 和 枚举 的方法默认下是不能修改值类型变量属性的。如下所示:
struct Rectangle{
var width: Double = 0.0
var height: Double = 0.0
// 实例方法
func changeWidth(width:Double) -> () { // func之前加上mutating是ok的
self.width = 320 // 如果结构体属性width与方法参数不同,则self可以省略不写,在这里是相同的self必须加上
}
}
// 编译失败:MyPlayground.playground:111:5: note: mark method 'mutating' to make 'self' mutable
func changeWidth(width:Double) -> () {
^
mutating
如果在方法名前加上mutating关键字,方法就是可变的,可变方法能够修改值类型变量属性,但不能修改值类型常量属性。
- 类的方法就是可变的,不需要添加关键字mutating便可修改值类型变量属性
- 在struct enum中,如果不修改方法是可变的。可以把要修改的类类型属性修改成引用类型数据。比如NSMutableArray() \ (self.str as NSString)
3、静态方法
-
也叫类型方法。枚举、结构体用static,类可用static与class,class该方法可以被子类重写,static不能被子类重写。
-
静态方法能修改静态变量属性 如下所示:
struct Rectangle{ static var width: Double = 0.0 var height: Double = 0.0 // 静态方法 static func changeWidth(width: Double) -> () { Rectangle.width = 123.0 // 静态方法内部不能调用实例属性 print(Rectangle.width) } } Rectangle.changeWidth(width: 123.0)// 类型名.方法名 ----------------------------类----------------------------- class Rectangle{ static var width: Double = 0.0 var height: Double = 0.0 // 如果是static不是class 则不能在继承类中被重写 class func changeWidth(width: Double) -> () { Rectangle.width = 123.0 // 静态方法内部不能调用实例属性 print(Rectangle.width) } } class RectangleB: Rectangle{ override class func changeWidth(width: Double) -> () { Rectangle.width = 123.0 // 静态方法内部不能调用实例属性 可换static print(Rectangle.width) } }
二、构造函数
1、构造函数没有返回值。类的默认的构造函数是init(){},结构体的构造函数是init(){} 与init(顺序属性列表){}
结构体定义:
struct Rectangle{
var width: Double = 0.0
var height: Double = 0.0
}
结构体实例化:(第二种写法是一种默认的构造函数,仅适用于结构体,不适用于类)

-
类中默认不含上图中第二个构造函数。可以自己重构构造函数,构造中的函数可以直接作为标签使用(构造函数的重载)
class Rectangle{ var width: Double var height: Double // 构造函数的重载 init(width: Double, height: Double) { self.width = width self.height = height } init(W width: Double, H height: Double) { // 与上个构造函数为不同的构造函数 self.width = width self.height = height } init(length: Double){ self.width = length self.height = length } init(){ self.width = 640.0 self.height = 960.0 } }
2、属性初始化
-
类
-
在init()构造函数中,属性的赋值
class Rectangle{ let width: Double // 注意:构造函数还可以初始化常量存储属性 var height: Double init(){ width = 12.0 height = 13.0 // 如果构造函数中 没有给属性赋值,编译失败。如果没有构造函数,且也没有给属性赋默认值,也是编译失败的。实例化更是失败了 } }
-
-
结构体
struct Rectangle{ var width: Double // let也是一样的(存储属性) var height: Double init(){ width = 12.0 height = 13.0 // 省略构造函数内容的初始化工作,编译失败。如果没有构造函数,且也没有给属性赋默认值,在没有实例化的情况下,是编译通过的。实例时候失败 } }
-
计算属性不保存数据,所以不需要初始化。构造函数也不能初始化静态属性,因为静态属性与实例无关,构造函数与实例息息相关。
3、构造函数代理
-
结构体构造函数代理:在同一个类型中通过self.init语句调用当前类型的其他构造函数,其他构造函数就称为构造函数代理
struct Rectangle{ var width: Double var height: Double // 构造函数的重载 init(width: Double, height: Double) { self.width = width self.height = height } init(W width: Double, H height: Double) { self.width = width self.height = height } init(length: Double){ self.init(W: length, H: length) // init(W:H:)就称构造函数代理 } init(){ self.init(width: 640.0, height: 960.0) // init()就称构造函数代理 } }
-
类的构造函数代理
- 横向代理:类似结构体的构造函数代理。便利构造函数(convenience initializer)
convenience便利,使用convenience修饰的构造函数叫做便利构造函数。便利构造函数通常用在对系统的类进行构造函数的扩充使用。
便利构造函数的特点:
1、便利构造函数通常都是写在extension里面
2、便利构造函数init前需要加上convenience
3、在便利构造函数中需要调用self.init
- 横向代理:类似结构体的构造函数代理。便利构造函数(convenience initializer)
class Rectangle{
var width: Double
var height: Double
// 构造函数的重载
init(width: Double, height: Double) {
self.width = width
self.height = height
}
init(W width: Double, H height: Double) {
self.width = width
self.height = height
}
convenience init(length: Double){ // 便利构造函数
self.init(W: length, H: length)
}
convenience init(){ // 便利构造函数
self.init(width: 640.0, height: 960.0)
}
}
- 向上代理:在继承时候,子类构造函数要先调用父类的构造函数初始化父类的存储属性。指定构造函数(designated initializer)
三、析构函数 deinit
-
实例内存资源不需要析构函数释放(Swift是ARC),但是清理工作有时候还是需要的。
// 析构函数 class RectangleB{ var width: Double var height: Double // 构造函数的重载 init(width: Double, height: Double) { self.width = width self.height = height } init(W width: Double, H height: Double) { self.width = width self.height = height } convenience init(length: Double){ // convenience代表是便利构造函数 self.init(W: length, H: length) } convenience init(){ self.init(width: 640.0, height: 960.0) } deinit { // rectB1 = nil 赋值为空的时候调用deinit 只有可选类型才能赋值为nil print("调用析构函数") self.width = 0.0 self.height = 0.0 } } // 实例化 var rectB1: RectangleB? = RectangleB(width: 320, height: 480) print(rectB1!.width) rectB1 = nil
网友评论