一阔拳、屬性
1脓钾、存儲屬性
存儲屬性就是存儲特定類的一個常量或者變量
//這里的name宾濒,age就是存儲屬性
struct Person{
let name:String
var age:Int
}
2帕翻、懶存儲屬性
懶存儲屬性是指第一次調(diào)用的時候才會計算其初始值的屬性宠进,通過lazy來標識
class Person{
//假如這個類初始化的時候是耗時操作
}
class PersonInfo{
//懶加載的話不用初始化p屬性的時候就穿件Person實例晕拆,可以等到用的時候再加載,
//而且p并不是一定要用砰苍,這樣即可以節(jié)省時間潦匈,又可以節(jié)省內(nèi)存
lazy var p = Person()
}
注意:必須將懶存儲屬性聲明成變量,因為屬性的值在實例構(gòu)造完成之前可能無法得到赚导,而常量屬性在構(gòu)造過程完成之前必須要有初始值茬缩,因此懶存儲屬性必須聲明為變量。
3吼旧、計算屬性
計算屬性不存儲值凰锡,而是提供了一個getter和setter來分別進行獲取值和設(shè)置其他屬性的值。getter圈暗、setter分別使用get掂为、set關(guān)鍵字進行定義。
class Person{
//age是存儲屬性
var age:Int = 18
//height是計算屬性
var height:Int
{
get{
return 3;
}
set{
age = newValue/2;
}
}
//只讀計算屬性
var height1:Int
{
get{
return 3;
}
}
//只讀屬性可以省略get
var height2:Int
{
return 3;
}
}
4员串、屬性觀察器
詳見swift下標腳本語法勇哗、willSet、didSet方法
5寸齐、類型屬性
類型屬性用關(guān)鍵字static標識欲诺,可用class代替static關(guān)鍵字。類型屬性屬于類用(類名.屬性)方式調(diào)用
class Person{
static var age:Int = 18
}
print(Person.age)
二渺鹦、方法
實例方法由對象調(diào)用扰法,類型方法由類調(diào)用
1、實例方法
class Person{
//無參無返回值
func info(){
print("hahaha")
}
//有參無返回值
func info1(age:Int,name:String){
print(age)
}
//無參有返回值
func info2() -> String {
return "我是返回值";
}
//有參有返回值
func info3(name:String) -> String{
return name;
}
}
let p = Person()
p.info()
p.info1(age: 1, name: "我是名字")
print(p.info2())
print(p.info3(name: "我是info3"))
控制臺輸出值:
hahaha
1
我是返回值
我是info3
2毅厚、類型方法
類方法由類調(diào)用塞颁,僅此而已
class PersonInfo{
static func sayHello(){
print("hello")
}
}
PersonInfo.sayHello()
控制臺輸出值:
hello
三、構(gòu)造函數(shù)
構(gòu)造函數(shù)是一種特殊的函數(shù),主要用來在創(chuàng)建對象時初始化對象祠锣,為對象的屬性設(shè)置初始值
Tips:Swift中類實例化之后酷窥,所有的存儲型屬性必須有值。
1锤岸、構(gòu)造函數(shù)基礎(chǔ)
創(chuàng)建類之后必定要實例化對象竖幔,現(xiàn)在有兩種方法設(shè)置初始值。
//方法一:定義屬性時賦初始值
class Person{
var name:String = "我是張三"
var age:Int = 16
}
var p = Person()
print(p.name)
//方法二:將屬性值設(shè)置為Optional
class Person{
var name:String?
var age:Int?
}
var p = Person()
p.name = "name"
print(p.name!)
觀察之后不難發(fā)現(xiàn)這兩種方法設(shè)置初始值費時費力是偷。由此引出構(gòu)造函數(shù)
import UIKit
class Teacher : NSObject{
var name:String
//重寫構(gòu)造函數(shù)
override init(){
name = "dadada"
super.init()
}
}
var t = Teacher()
//t.name = "大老師"
print(t.name)
2拳氢、重載構(gòu)造函數(shù)
重寫:子類繼承父類,重寫父類的方法
重載:當前類中方法名相同蛋铆,參數(shù)列表不同
class Student : NSObject{
var name:String
var age:Int
//如果重載了構(gòu)造函數(shù)馋评,系統(tǒng)默認提供的構(gòu)造函數(shù)就不能再被訪問
init(name:String, age:Int) {
self.name = name
self.age = age
}
}
var s = Student(name:"zhng",age:14)
print(s.name)
3、指定構(gòu)造函數(shù)與便利構(gòu)造函數(shù)
//指定構(gòu)造函數(shù) 是類中最主要的構(gòu)造函數(shù)刺啦。一個指定構(gòu)造函數(shù)將初始化類中提供的所有屬性留特,并根據(jù)繼承鏈往上調(diào)用父類的構(gòu)造函數(shù)來實現(xiàn)父類的初始化
//便利構(gòu)造函數(shù)是類中比較次要的、輔助型的構(gòu)造函數(shù)玛瘸。蜕青。可以定義便利構(gòu)造函數(shù)來調(diào)用同一個類中的指定構(gòu)造函數(shù)糊渊,并為其參數(shù)提供默認值右核。
//便利構(gòu)造函數(shù)有以下幾個特點
//1、只有便利構(gòu)造函數(shù)中可以調(diào)用self.init()
//2渺绒、便利構(gòu)造函數(shù)不能被重寫或者使用super調(diào)用父類的構(gòu)造函數(shù)
//3贺喝、不能被繼承
class Per : NSObject{
var name : String
init(name:String) {
self.name = name;
super.init()
}
convenience override init() {
self.init(name:"哈哈哈");
}
deinit {
print("Per被銷毀了")
}
}
四、析構(gòu)函數(shù)
在一個類的實例被釋放之前宗兼,析構(gòu)函數(shù)會被調(diào)用躏鱼。deinit無參 無返回值。
class Per : NSObject{
var name : String
init(name:String) {
self.name = name;
super.init()
}
convenience override init() {
self.init(name:"哈哈哈");
}
deinit {
print("Per被銷毀了")
}
}
var pp:Per? = Per()
print(pp!.name)
pp = nil
控制臺返回如下:
哈哈哈
Per被銷毀了