Swift學(xué)習(xí)筆記五之類和結(jié)構(gòu)體

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)行值拷貝

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載自:http://c.biancheng.net/cpp/html/2427.html 類和結(jié)構(gòu)體是人們構(gòu)建代...
    Poison_19ce閱讀 299評(píng)論 0 0
  • Swift語(yǔ)法基礎(chǔ)(五)-- (類和結(jié)構(gòu)體、屬性、方法) 本章將會(huì)介紹 類和結(jié)構(gòu)體對(duì)比結(jié)構(gòu)體和枚舉是值類型類是引用...
    寒橋閱讀 1,175評(píng)論 0 1
  • 基礎(chǔ)部分(The Basics) 當(dāng)推斷浮點(diǎn)數(shù)的類型時(shí),Swift 總是會(huì)選擇Double而不是Float。 結(jié)合...
    gamper閱讀 1,488評(píng)論 0 7
  • 請(qǐng)各位讀者添加一下作者的微信公眾號(hào),以后有新的文章,將在微信公眾號(hào)直接推送給各位,非常感謝。 1.前言 我們?cè)谌粘?..
    MR_LIXP閱讀 4,633評(píng)論 4 25
  • ------ 剛落入凡塵,并不是每個(gè)人都背著十字架來(lái)的,也許是一顆釘子,一根直直的棍。在我們的世界觀中,...
    高崗閱讀 285評(píng)論 0 0

友情鏈接更多精彩內(nèi)容