Swift 中的 Class 和 Structure
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