1、類和結(jié)構(gòu)體都可以通過(guò)定義屬性和添加方法來(lái)擴(kuò)展功能
類和結(jié)構(gòu)體的共同點(diǎn):通過(guò)定義屬性存儲(chǔ)值;通過(guò)定義方法提供功能;通過(guò)定義構(gòu)造器聲稱初始化值
類與結(jié)構(gòu)體的區(qū)別:
類:允許一個(gè)類繼承另一個(gè);允許引用計(jì)數(shù)器對(duì)一個(gè)類的多次引用
結(jié)構(gòu)體:結(jié)構(gòu)體通過(guò)復(fù)制的方式在代碼中傳遞,不使用引用計(jì)數(shù)器
2、類與結(jié)構(gòu)體的語(yǔ)法定義
class ClassName{ //類名首字母用大寫
//屬性和方法 //屬性名和方法名的首字母用小寫
}
struct StructureName{ //結(jié)構(gòu)體名首字母用大寫
//屬性和方法 //屬性名和方法名的首字母用小寫
}
3、實(shí)例化類和結(jié)構(gòu)體,訪問(wèn)屬性
struct Resolution{
var width = 0
var height = 0
}
class VideoMode{ //定義名為VideoMode的類
var resolution = Resolution() //初始化一個(gè)新的Resolution的結(jié)構(gòu)體實(shí)例
var interlaced = false //定義一個(gè)默認(rèn)值為false的布爾類型
var frameRate = 0.0
var name: String?
}
//實(shí)例化結(jié)構(gòu)體和類
let someResolution = Resolution() //屬性都被初始化為默認(rèn)值
let someVideoMode = VideoMode()
print(someResolution.width) //通過(guò)點(diǎn)語(yǔ)法訪問(wèn)屬性
print(someVideo. resolution.height) //訪問(wèn)子屬性
4、結(jié)構(gòu)體的默認(rèn)構(gòu)造器
let initRes1 = Resolution(width:22,height:44) //結(jié)構(gòu)體可設(shè)置屬性的默認(rèn)構(gòu)造器
print("(initRes1.width),(initRes1.height)")//
類沒(méi)有默認(rèn)構(gòu)造器,需要自定義
5、結(jié)構(gòu)體和枚舉值的傳遞都是通過(guò)值拷貝
//相當(dāng)于拷貝了一個(gè)副本給initRes2,改變initRes2的屬性值不影響initRes1的值
var initRes2 = initRes1
print(initRes1.width) //22
print(initRes2.width) //22改變前的值
initRes2.width = 43
print(initRes1.width) //22
print(initRes2.width) //43改變后的值
enum Direction{
case North,South,East,West
}
var direct1 = Direction.North
var direct2 = direct1
direct2 = Direction.south
print(direct1) //North
print(direct2)//South ,direct2的值改變不會(huì)影響direct1
6、類是引用拷貝,拷貝后的值的改變會(huì)影響原來(lái)的
let videoM1 = ViewMode()
videoM1.name = "videoM1"
//videoM1傳遞的是一個(gè)引用,videoM2還是指向videoM1哪一塊內(nèi)存存儲(chǔ)空間
var videoM2 = viedeoM1
videoM2.name = "videoM2"
print(videoM1.name)//videoM2
print(videoM2.name)//videoM2
"==="恒等運(yùn)算符,用三個(gè)等號(hào)表示,兩個(gè)類型的常量或者變量是否引用同一個(gè)實(shí)例,判斷兩個(gè)引用是否指向同一個(gè)對(duì)象
print(videoM1===videoM2)
7、類和結(jié)構(gòu)體的選擇
結(jié)構(gòu)體:只是用來(lái)封裝少量簡(jiǎn)單的數(shù)據(jù)值;實(shí)例被賦值或傳遞存儲(chǔ)的時(shí)候需要進(jìn)行值拷貝,不需要用到繼承
類:需要包含復(fù)雜的屬性方法,能形成一個(gè)抽象的事物描述,需要用到繼承,需要用到引用拷貝
字符串、數(shù)組、字典、的底層都是通過(guò)結(jié)構(gòu)體實(shí)現(xiàn)的,所以它們?cè)诒毁x值的時(shí)候都是通過(guò)值拷貝
當(dāng)然swift內(nèi)部會(huì)做性能優(yōu)化,不會(huì)只要賦值就拷貝,只有在必要的時(shí)候才會(huì)進(jìn)行值拷貝