swift價格 - swift教學




結構與類在迅速語言 (8)

Alreday有很多關於這方面的文字,我想在那裡加一個類比。 希望在這之後你永遠不會懷疑:底線: 類通過引用傳遞,而結構則通過值傳遞。

假設您正在與朋友分享Google文檔。 現在,如果他改變了這一點,你也會看到你的谷歌文檔的變化,意味著你的副本也受到影響。 這基本上是“ 通過參考傳遞 ”。

但是,假設你的機器中保存了一個.XLS文件。 你提供該文件給你的朋友。 現在,如果他正在對該文件進行任何更改,您的文件不會因為您擁有自己的副本而受到干擾/影響。 這基本上是“ 按價值傳遞 ”。 你已經有多個簡單的程序來檢查這種類比在迅速的遊樂場。

從Apple的書中“結構和類之間最重要的區別之一就是結構總是在代碼中傳遞時被複製,但類是通過引用傳遞的。”

任何人都可以讓我明白這是什麼意思,對我來說,類和結構似乎是相同的。


struct是值類型。 這意味著如果將結構的實例複製到另一個變量中,它只會復製到變量中。

值類型的示例

struct Resolution {
    var width = 2
    var height = 3
}

let hd = Resolution(width: 1920, height: 1080)
var cinema = hd //assigning struct instance  to variable
println("Width of cinema instance is \(cinema.width)")//result is 1920
println("Width of hd instance is \(hd.width)")//result is 1920

cinema.width = 2048

println("Width of cinema instance is \(cinema.width)")//result is 2048
println("Width of hd instance is \(hd.width)")//result is 1920

類是引用類型。 這意味著如果您將類的實例分配給變量,則它將只保存對實例的引用 而不保存副本


以上答案是正確的我希望我的回答能幫助不了解上述答案的人。

那麼在Swift中有兩種類型的對象

  1. 結構

他們之間的主要區別是

  • 結構是類型
  • 類是引用類型

例如這裡的代碼要很好理解。

struct SomeStruct {
var a : Int;

init(_ a : Int) {
    self.a = a
}
}

class SomeClass {
var a: Int;

init(_ a: Int) {
    self.a = a
}

}
var x = 11

var someStruct1 = SomeStruct(x)
var someClass1 = SomeClass(x)

var someStruct2 = someStruct1
var someClass2 = someClass1

someClass1.a = 12
someClass2.a // answer is 12 because it is referencing to class 1     property a

someStruct1.a = 14
someStruct2.a // answer is 11 because it is just copying it not referencing it

這是主要的區別,但我們也有分歧。

  1. 必須聲明初始化者(constructer)
  2. 擁有deinitialisers
  3. 可以從其他類繼承

結構

  1. 它為您提供免費的初始化程序,如果您的免費初始化程序將被您的已聲明的初始程序程序覆蓋,則您不必聲明無效程序
  2. 不要有deinitialiser
  3. 不能從其他結構繼承

如果你在蘋果手冊中看得更遠,你會看到這一節:“結構和枚舉是值類型”

在本節中,您將看到以下內容:

“let hd = Resolution(width:1920,height:1080)var cinema = hd這個例子聲明了一個叫做hd的常量,並將其設置為Resolution實例使用全高清視頻的寬度和高度(1920像素寬×1080像素高)進行初始化。

然後它聲明一個名為cinema的變量並將其設置為hd的當前值。 由於“解決方案”是一個結構,現有實例的副本已製作完成,並且此新副本將分配給電影院。 儘管高清和電影現在具有相同的寬度和高度,但它們是幕後的兩個完全不同的實例。

接下來,將電影的寬度屬性修改為用於數字電影放映的寬度稍寬的2K標準(寬度為2048像素,高為1080像素):

電影寬度= 2048檢查電影的寬度屬性表明它確實已經改變為2048:

println(“電影現在是(電影寬度)像素寬度”)//打印“電影寬度現在為2048像素寬但是,原始高清實例的寬度屬性仍舊是舊的1920年的價值:

println(“hd仍然是(高清寬)像素寬”)//打印“hd仍然是1920像素寬”

當電影獲得hd的當前值時,存儲在hd中的值被複製到新的電影實例中。 最終結果是兩個完全分離的實例,它們恰好包含相同的數值。 由於它們是獨立的實例,因此將電影寬度設置為2048不會影響存儲在hd中的寬度。“

摘錄自:Apple Inc.“Swift編程語言”,iBooks。 https://itun.es/us/jEUH0.l

這是結構和類之間最大的區別。 複製結構並引用類。


結構和類之間的主要差異:

  • 結構不能從其他類型繼承。
  • 類使用類型轉換將類視為超類或子類,以及檢查協議採用。 結構只能使用協議採用部分。
  • 結構沒有去初始化器。
  • 結構不能有多個對同一個實例的引用

這個問題似乎是重複的,但無論如何,以下內容都可以回答大部分用例:

  1. 結構和類之間最重要的區別之一是結構是值類型,並且在代碼中傳遞時總是被複製,而類是引用類型並通過引用傳遞。

  2. 另外,類有繼承,它允許一個類繼承另一個類的特性。

  3. Struct屬性存儲在Stack中,Class實例存儲在Heap上,因此,有時堆棧比類更快。

  4. Struct自動獲得一個默認的初始化器,而在Class中,我們必須初始化。

  5. Struct在任何時間點都是線程安全的或單例。

而且,為了總結結構和類之間的差異,有必要了解值和引用類型之間的差異。

  1. 當您創建一個值類型的副本時,它會將您正在復制的東西的所有數據複製到新變量中。 他們是2件獨立的事情,改變一個不會影響另一個。
  2. 在創建引用類型的副本時,新變量指向與正在復制的內容相同的內存位置。 這意味著更改一個會改變另一個,因為它們都指向相同的內存位置。 下面的示例代碼可以作為參考。

// sampleplayground.playground

  class MyClass {
        var myName: String
        init(myName: String){
            self.myName = myName;
        }
    }

    var myClassExistingName = MyClass(myName: "DILIP")
    var myClassNewName = myClassExistingName
    myClassNewName.myName = "John"


    print("Current Name: ",myClassExistingName.myName)
    print("Modified Name", myClassNewName.myName)

    print("*************************")

    struct myStruct {
        var programmeType: String
        init(programmeType: String){
            self.programmeType = programmeType
        }
    }

    var myStructExistingValue = myStruct(programmeType: "Animation")
    var myStructNewValue = myStructExistingValue
    myStructNewValue.programmeType = "Thriller"

    print("myStructExistingValue: ", myStructExistingValue.programmeType)
    print("myStructNewValue: ", myStructNewValue.programmeType)

輸出:

Current Name:  John
Modified Name John
*************************
myStructExistingValue:  Animation
myStructNewValue:  Thriller

通常(在大多數編程語言中),對像是存儲在堆上的數據塊,然後對這些塊的引用(通常是指針)包含用於訪問這些數據塊的name 。 該機制允許通過複製引用(指針)的值來共享堆中的對象。 這不是基本數據類型(如Integers)的情況,這是因為創建引用所需的內存與對象(在此情況下為整數值)幾乎相同。 因此,它們將作為值而不是作為大對象情況下的參考傳遞。

即使使用String和Array對象,Swift也使用struct來提高性能。

這裡真的很棒


階級和結構都可以做到:

  • 定義屬性以存儲值
  • 定義提供功能的方法
  • 擴展
  • 符合協議
  • 定義先驗者
  • 定義下標以提供對其變量的訪問

只有班級可以做到:

  • 遺產
  • 類型鑄造
  • 定義deinitialisers
  • 允許參考計數多個參考。




swift