struct和class區別

本質區別:struct 是值引用(value reference),而 class 是地址引用(class reference)。后面很多差異都是因此導致的。

構造方法

struct 會自動將成員變量自動添加到構造方法中,自動生成帶參構造器。

  • 注1:自動生成的帶參構造器會將全部參數加入。
  • 注2:如果當中有一個私有屬性,那么就不會自動生成帶參構造器。

class 不會自動生成帶參構造器


等號賦值

struct是值引用類型,那么在使用等號賦值的時候,會將值復制一份出來。class 是地址引用類型,那么在賦值的時候,就會復制地址,也就是一個新的指向原來地址的指針

  • 這就會導致class中,新賦值的class對象中成員變量值修改了,舊的class對象中成員變量的值也會被修改。
struct SRectangle {
    var width = 50
    var height = 50
}

class CRectangle {
    var width = 50
    var height = 50
}

var sOld = SRectangle()
var sNew = sOld
sOld.width = 100
//這里 sNew.width 值是 50 不受影響

var cOld = CRectangle()
var cNew = cOld
cOld.width = 100
//這里 cNew.width 值也變成了 100 

成員變量

struct 是值引用類型,所以整個對象是一個整體,他實例對象如果是用 let 修飾的,那么無論里面成員變量是用 var 還是 let 修飾 ,其成員變量的值都是不可改變的。

struct Rectangle {
    var width = 50
    var height = 50
}

//調用
let myRectangle = Rectangle()
//myRectangle.width = 100
//這里如果調用就會報錯,說他是不能改變的

class 是地址引用類型的,即使對象是 let 修飾也是可以修改里面的成員變量

class Rectangle {
    var width = 50
    var height = 50
}

//調用
let myRectangle = Rectangle()
myRectangle.width = 100
//這里調用就是沒有問題的

繼承

struct無法繼承,class可以繼承


extension 使用

struct 在 extension 中添加方法來修改成員變量的值的時候,需要在方法前加 mutating ,class 則不需要

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 類和結構體區別 1,內存管理方式不一樣, 類引用類型, 分配在堆上。 結構體值類型,分配在棧上。 類 ,有析構。...
    我是小胡胡123閱讀 244評論 0 1
  • 307、setValue:forKey和setObject:forKey的區別是什么? 答:1, setObjec...
    AlanGe閱讀 1,592評論 0 1
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,541評論 1 51
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,896評論 1 10
  • 記第一次吃臺灣菜 昨晚為了提前給一個大學舍友慶祝生日 去萬達吃了臺灣料理 第一次吃這么家常的臺灣料理 點了四個菜加...
    爍火火閱讀 245評論 0 0