日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IOS中结构体(struct)

發(fā)布時(shí)間:2024/3/13 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IOS中结构体(struct) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

IOS中之struct(結(jié)構(gòu)體)

  • 前言
  • struct的基本語法
  • struct 和class的區(qū)別
  • class和struct比較,優(yōu)缺點(diǎn)?
  • struct的優(yōu)勢
  • 使用Struct和Protocol來實(shí)現(xiàn)model的繼承和共享

前言

  • 引用類型: 賦值時(shí),系統(tǒng)不會(huì)對其對象拷貝,而是把指向該對象的指針(對象的地址值)賦值給另外一個(gè)對象,當(dāng)修改某個(gè)對象的值,會(huì)隨之影響另外一個(gè)對象的值

  • 值類型: 賦值時(shí),系統(tǒng)會(huì)對此對象進(jìn)行拷貝,賦值出一份副本給另外一個(gè)對象,當(dāng)修改一個(gè)對象的值時(shí)不影響另外一個(gè)對象

在Swift中struct是屬于值類型,相對于其他語言來說,Swift的結(jié)構(gòu)體功能更加強(qiáng)大,它除了支持在結(jié)構(gòu)體聲明中基礎(chǔ)變量之外,它還支持在結(jié)構(gòu)體中聲明方法,這相對于其他語言來說,是swift的一個(gè)特性之一。

swift在本質(zhì)上來說是面向協(xié)議(Protocol Oriented)的語言,struct沒有也不需要繼承的功能,為了實(shí)現(xiàn)某個(gè)功能,struct去服從并實(shí)現(xiàn)某個(gè)協(xié)議就即可,從一個(gè)較高的層次來看,struct+protocol是構(gòu)成swift面向協(xié)議語言的兩個(gè)基石

  • 為什么需要使用結(jié)構(gòu)體
    • struct可保證代碼更加安全可靠,以及struct+protocol更加切合swift面向協(xié)議編程的初衷。
    • struct 更快,簡單,安全,適合數(shù)據(jù)處理操作使用,在iOS開發(fā)中適合http請求的數(shù)據(jù)操作中使用。對于數(shù)據(jù)的處理解析和其他操作更快,更省內(nèi)存。

struct的基本語法

  • 結(jié)構(gòu)中聲明變量,可以不用初始化值,但是calss中需要初始化值的
  • Struct 會(huì)自動(dòng)生成一個(gè)初始化成員變量的構(gòu)造器方法,創(chuàng)建結(jié)構(gòu)體的時(shí)候調(diào)用構(gòu)造器方法賦值,但是class需要自己生成
struct StructTest {var name: Stringvar age: Intvar color: UIColor}let test = StructTest(name: "guoweiyong", age: 23, color: UIColor.red)
  • 如果你重寫了init()方法,系統(tǒng)不會(huì)幫你生成初始化構(gòu)造器方法了。
init(name: String, age: Int) {self.name = nameself.age = ageself.color = UIColor.red} let test2 = StructTest(name: "GY", age: 22)**加粗樣式**
  • struct中聲明方法,如果方法內(nèi)部修改了 struct中聲明property(屬性)值,方法前面必須加上 mutating關(guān)鍵字,如果沒有涉及到修改屬性值的話,就不需要mutating修飾,正常聲明實(shí)現(xiàn)方法即可
//日過定義的方法中需要修改屬性值 必須要加上關(guān)鍵字mutating修飾方法mutating func funcTest(_ tempName: String) -> Void {self.name = tempName}func funcTest2() -> String {return name;}

struct調(diào)用方法和類一樣,對象.方法名()

  • 如果struct中聲明屬性時(shí),有一些屬性有初始化值,有一些沒有,那么系統(tǒng)會(huì)自動(dòng)生成兩種成員變量構(gòu)造器方法,一種是包括所有的成員變量,一種是只含有沒有初始化值的成員變量構(gòu)造器方法
struct StructTest {var name: Stringvar age: Int = 23var color: UIColor }//這兩種初始化方法都是正確的 let test3 = StructTest(name: <#T##String#>, age: <#T##Int#>, color: <#T##UIColor#>)let test4 = StructTest(name: <#T##String#>, color: <#T##UIColor#>)

struct對于let聲明的實(shí)例不能對變量進(jìn)行賦值,class預(yù)設(shè)值是可以賦值let實(shí)例的。注意Swift中常用的String、Array、 Dictionary都是struct。

struct 和class的區(qū)別

主要區(qū)別:

  • struct是值引用,而class是類型引用(各有好處值類型不用擔(dān)心內(nèi)存問題,但無法跨view完成同一個(gè)對象調(diào)用,只能是copy一份新對象使用。class 的內(nèi)存問題是需要程序要注意的,但是指針引用的強(qiáng)大毋庸置疑的。值類型是在棧空間上操作的,引用類型是在堆控件操作的)

  • struct沒有繼承的功能,class有繼承功能(struct不能像class 一樣繼承完成重用和多態(tài)。但是struct 可以通過組合和接口實(shí)現(xiàn)完成重用和多態(tài)。從這一點(diǎn)來說struct是比class有優(yōu)勢的)

  • 定義結(jié)構(gòu)體struct類型時(shí)其成員變量可以沒有初始值(編譯器會(huì)自動(dòng)生成一個(gè)成員構(gòu)造器,給變量賦一個(gè)默認(rèn)值),如果使用這種格式定義一個(gè)類,編譯器會(huì)報(bào)錯(cuò),他會(huì)提醒你這個(gè)類沒有被初始化

struct SRectangle {var width = 200var height: Int }class CRectangle {var width = 200var height: Int // 報(bào)錯(cuò) }

class和struct比較,優(yōu)缺點(diǎn)?

class有一下功能,struct是沒有的:

  • 1.class可以繼承,子類可以使用父類的特性和方法。但是struct是不能被繼承的
  • 2.類型轉(zhuǎn)換可以在運(yùn)行時(shí)檢查和解釋一個(gè)實(shí)例對象
  • 3.class可用 deinit來釋放資源
  • 4.一個(gè)類可以被多次引用

struct的優(yōu)勢

  • 結(jié)構(gòu)較小,適用于賦值操作,相比較一個(gè)class, 實(shí)例被多次引用(容易發(fā)生內(nèi)存泄漏),struct更安全
  • 無需擔(dān)心內(nèi)存泄漏問題(struct的操作都是在棧控件上,class在堆控件上)

使用Struct和Protocol來實(shí)現(xiàn)model的繼承和共享

  • 在項(xiàng)目中如何選擇Struct和Class
    • 默認(rèn)使用Struct
    • 當(dāng)你需要繼承Objective-C某些類的的時(shí)候使用class
    • 當(dāng)你需要控制唯一性時(shí)使用class
    • 我們使用struct和protocol來實(shí)現(xiàn)model繼承和共享行為
protocol AnimalCommonProtocol {var name: String? {get set} //表示屬性是可讀寫的,{ get }用來表示屬性為可讀的var weight: Double {get set}func run() }struct Cat: AnimalCommonProtocol {func run() {print("cat run")}var name: String?var weight: Double/// 自增屬性var gender: String? }struct Dog : AnimalCommonProtocol {var name: String?var weight: Double/// 自增屬性var type: String?func run() {print("Dog run")} }

總結(jié)

以上是生活随笔為你收集整理的IOS中结构体(struct)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。