Swift 中的 Class 和 Structure

RussellBurr 9年前發布 | 6K 次閱讀 Swift Apple Swift開發

LearniOS

Swift

Classes and Structures

1、類的實例通常被看做一個對象。然而,Swift中的類和結構體在功能上比其他語言更加相似,本章所討論的大部分實例都可以應用在類和結構體類型。因此,我們會主要使用實例。

2、當結構體類型在你的代碼中傳遞的時候,它們總是會拷貝。它不會使用引用計數。

3、Classes和Structure的聲明語法:

class SomeClass {

} struct SomeStructure {

}</code></pre>

4、當你定義一個新的類或者結構體的時候,你實際上就是在定義一種新的Swift類型。你應該使用 UpperCamelCase (eg:SomeClass/SomeStructure)這種命名方式來符合Swift的命名標準(eg:String/Int/Bool)。相反的,你應該用 lowerCamelCase 來個屬性或者方法來命名(eg:frameRate/incrementCount),以便和類型名區分。

struct Resolution {
    var width = 0
    var height = 0
}
class VideoMode {
    var resolution = Resolution()
    var interlaced = false
    var frameRate = 0.0
    var name: String?
}

5、不像Object-C,Swift可以直接設置結構體屬性的紫屬性的值。如下面的例子,someVideoMode的resolution的屬性width的值可以直接設置,而不需要你在給resolution整個賦一個新值。

struct Resolution {
    var width = 0
    var height = 0
}

class VideoMode { var resolution = Resolution() var interlaced = false var frameRate = 0.0 var name: String? }

let someVideo = VideoMode()

someVideo.resolution.width = 200</code></pre>

6、結構體另一種初始化方式:

let vga = Resolution(width: 640, height: 480)

類的實例不能這樣初始化。

7、值類型(Value Types):結構體、枚舉、其它基本數據類型等都是值類型。當它在賦值給常量/變量或者傳遞給函數的時候,會拷貝值。通過下面的例子我們可以發現,雖然cinema的width值變了,但hd的width值并沒有變。那是因為Resolution是一個結構體,在進行 var cinema = hd 這一句的時候,系統會拷貝一份hd的值賦給cinema。它們兩個是獨立的兩個結構體實例,所以改變cinema的值時,并不會影響hd。枚舉同上。

let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
cinema.width = 2000
print(hd,cinema)
//Resolution(width: 1920, height: 1080) Resolution(width: 2000, height: 1080)

8、引用類型(Reference Types):當它們在賦值或者傳遞給函數的時候不會拷貝值,因此,應用的是已存在的實例本身,并沒有拷貝。通過下面的例子我們可以看出,修改了alsoTenEighty的frameRate的值,tenEighty的frameRate的值頁跟著改變了。因為類是引用類型,tenEighty和alsoTenEighty其實引用的是同一個VideoMode實例。實際上,它們只是同一個實例的兩個不同的名字。

let tenEighty = VideoMode()
tenEighty.frameRate = 25.0

let alsoTenEighty = tenEighty alsoTenEighty.frameRate = 30.0

print(tenEighty.frameRate,alsoTenEighty.frameRate) //30.0 30.0</code></pre>

9、通過 === 和 !== 來判斷兩個實例是否為同一個類。

if tenEighty === alsoTenEighty {
    print("yes")
}
//yes

=== 和 == 是不同的, === 代表兩個類類型的常量或者變量醫用同一個類的實例,而 == 代表兩個常量或者變量的值相等。

10、在Swift中String、Array、Dictionary均已結構體的形式實現;Object-C中NSString、NSSArray、NSDictionary均已類的形式實現。

11、在你的代碼中,拷貝行為看起來似乎總會發生。然而,Swift在幕后只在絕對必要時才執行實際的拷貝。Swift管理所有的值拷貝以確保性能最優化,所以你沒必要去回 避賦值來保證性能最優化。

 

來自:https://github.com/fengzhihao123/LearniOS/blob/master/Swift/ClassesAndStructures.md

 

 本文由用戶 RussellBurr 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!