Swift 結(jié)構(gòu)體 和 類 ⑤

??在Swift標(biāo)準(zhǔn)庫中,絕大多數(shù)的公開類型都是結(jié)構(gòu)體驯妄,而枚舉和類之占一小部分荷并,比如:Bool、Int青扔、Double源织、String、Array微猖、Dictionary等常見類型都是結(jié)構(gòu)體

結(jié)構(gòu)體

1 結(jié)構(gòu)體初識

  • 所有結(jié)構(gòu)體都有一個編譯器自動生成初始化器(ininiallizer谈息, 初始化方法、構(gòu)造器励两、構(gòu)造方法)示例:
struct Date {
    var year : Int
    var month : Int
    var day : Int
    
}
var date = Date(year: 2020, month: 07, day: 24)
 //這里只是定義了Date結(jié)構(gòu)體黎茎,但是直接可以調(diào)用Date(year: 2020, month: 07, day: 24)
  • 編譯器會根據(jù)情況,可能會為結(jié)構(gòu)體生成多個初始化器当悔,宗旨是:保證所有成員都有初始值傅瞻,示例:
struct Point {
    var x : Int = 0
    var y : Int
    
}
var p1 = Point(x: 10, y: 20)  //正常
var p2 = Point(y: 20)//正常
var p2 = Point(x: 10)//報錯 Missing argument for parameter 'y' in call

2. 自定義初始化器

  • 一旦在定義結(jié)構(gòu)體時自定義了初始化器,則編譯器不會在幫它自動生成其他初始化器盲憎,示例
struct Person {
    var name : String
    var age : Int
    init(name:String , age: Int) {
        self.name = name
        self.age = age
    }
}

1. 類初識

  • 類的定義和結(jié)構(gòu)體類似嗅骄,但編譯器并沒有為類自動生成可以傳入成員變量的初始化器,示例
class Student {
    var name : String
    var age : Int
}
  • 如果類的所有成員都在定義時饼疙,指定了初始化值溺森,則編譯器會為類生成無參的初始化器。示例
class Student {
    var name : String = "Jack"
    var age : Int = 0
    
}
var std = Student()

結(jié)構(gòu)體 與 類 的本質(zhì)區(qū)別(待補(bǔ)充

1. 結(jié)構(gòu)體是值類型(枚舉也是值類型),類是引用類型(指針類型··· )

  • 值類型:值類型賦值給 var 屏积、let 或者給函數(shù)傳參医窿,是直接將所有內(nèi)容拷貝一份,屬于深拷貝
  • 引用類型: 引用賦值給 var炊林、let或者給函數(shù)傳參姥卢,是將內(nèi)存地址拷貝一份,屬于淺拷貝渣聚。

注意:在Swift標(biāo)準(zhǔn)庫中独榴,為了提升性能,String奕枝、Array棺榔、Dictionary、Set 采取了Copy On Write隘道,
??1. 比如僅當(dāng)有 "寫" 操作時症歇,才會真正執(zhí)行拷貝操作。
對于標(biāo)準(zhǔn)庫值類型的賦值操作薄声,Swift能確保最佳性能当船,所以沒有必要為了保證最佳性能來避免賦值
??2.不需要修改的變量盡量定義成let


// 值類型賦值 ;String默辨、Array、Dictionary苍息、Set也是結(jié)構(gòu)體類型缩幸,所以他們也屬于值類型
struct Point {
    var x : Int = 0
    var y : Int
    
}
func test(){
    var p1 : Point = Point(x: 10, y: 20)
    var p2 : Point = p1
    
    p2.x = 22
    p2.y = 33
    
    print(p1)//Point(x: 10, y: 20)
}


var s1 = "jack"
var s2 = s1
s2.append("_hi")
print(s1)// jack
print(s2)//jack_hi

2. 值類型 、引用類型 的 let

struct Point {
    var x : Int
    var y : Int
    
}

class Size {
    var width : Int
    var height : Int
    init(width: Int, height: Int) {
        self.width = width
        self.height = height
    }
}


let po1 = Point(x: 10, y: 20)
po1 = Point(x: 2, y: 3)  //報錯:Cannot assign to value: 'po1' is a 'let' constant
po1.x = 2 //報錯:Cannot assign to value: 'po1' is a 'let' constant
po1.y = 3 //報錯:Cannot assign to value: 'po1' is a 'let' constant

let si1 = Size(width: 10, height: 20)
si1 = Size(width: 2, height: 3)// 報錯:Cannot assign to value: 'si1' is a 'let' constant
si1.width = 2
si1.height = 3

注意:對于引用類型 si 竞思,其實(shí)存放的是一個地址表谊,指向堆一個堆內(nèi)存空間,
let si 指的是不能修改這個si指向的地址內(nèi)存盖喷,si1.width = 2 si1.height 實(shí)際上是改的對應(yīng)堆空間里面的值爆办,并沒有修改si的地址指向,所以并不會報錯课梳。


嵌套類型

??類似于內(nèi)部類距辆。如果某個類只在某個類里面使用時,則可以使用嵌套類型暮刃。

struct PersonObj {
    enum sex : String {
        case man = "1", woman = "2"
    }
    enum nation : Int {
        case hanzu = 1 , manzu = 2 , weiwuerzu = 3
    }
}

print(PersonObj.sex.man.rawValue)

var sextype = PersonObj.sex.man
sextype = .woman

枚舉跨算、結(jié)構(gòu)體、類都可以定義方法

  • 一般把定義在枚舉椭懊、結(jié)構(gòu)體诸蚕、類內(nèi)部的函數(shù),叫做方法
  • 方法不占用對象的內(nèi)存空間,方法的本質(zhì)就是函數(shù)背犯,方法和函數(shù)都存放在代碼段
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末坏瘩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子漠魏,更是在濱河造成了極大的恐慌桑腮,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛉幸,死亡現(xiàn)場離奇詭異破讨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)奕纫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門提陶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人匹层,你說我怎么就攤上這事隙笆。” “怎么了升筏?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵撑柔,是天一觀的道長。 經(jīng)常有香客問我您访,道長铅忿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任灵汪,我火速辦了婚禮檀训,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘享言。我一直安慰自己峻凫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布览露。 她就那樣靜靜地躺著荧琼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪差牛。 梳的紋絲不亂的頭發(fā)上命锄,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機(jī)與錄音多糠,去河邊找鬼累舷。 笑死,一個胖子當(dāng)著我的面吹牛夹孔,可吹牛的內(nèi)容都是我干的被盈。 我是一名探鬼主播析孽,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼只怎!你這毒婦竟也來了袜瞬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤身堡,失蹤者是張志新(化名)和其女友劉穎邓尤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贴谎,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡汞扎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了擅这。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澈魄。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖仲翎,靈堂內(nèi)的尸體忽然破棺而出痹扇,到底是詐尸還是另有隱情,我是刑警寧澤溯香,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布鲫构,位于F島的核電站,受9級特大地震影響玫坛,放射性物質(zhì)發(fā)生泄漏结笨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一昂秃、第九天 我趴在偏房一處隱蔽的房頂上張望禀梳。 院中可真熱鬧,春花似錦肠骆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扫外,卻和暖如春莉钙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背筛谚。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工磁玉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人驾讲。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓蚊伞,卻偏偏與公主長得像席赂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子时迫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354