與其餘編程語言所不一樣的是,Swift 並不要求你爲自定義類和結構去建立獨立的接口和實現文件。你所要作的是在一個單一文件中定義一個類或者結構體,系統將會自動生成面向其它代碼的外部接口。編程
注意:一般一個類的實例被稱爲對象。然而在Swift 中,類和結構體的關係要比在其餘語言中更加的密切,本章中所討論的大部分功能均可以用在類和結構體上。所以,咱們會主要使用實例而不是對象。編程語言
比較類和結構體ide
類和結構體都具備如下特性:函數
類還具備結構體沒有的功能,以下:spa
注意:結構體老是經過被複制的方式在代碼中傳遞,所以請不要使用引用計數。指針
定義語法code
使用class關鍵字來申明一個類,使用struct關鍵字來申明一個結構體。視頻
class SomeClass { } struct SomeStructure { }
注意:類和結構體名稱以大寫字母開頭,屬性和方法名稱以小寫字母開頭。對象
示例以下blog
struct Resolution { var width = 0 var heigth = 0 } class VideoMode { var resolution = Resolution() var interlaced = false var frameRate = 0.0 var name: String? }
在上面的示例中咱們定義了一個名爲Resolution的結構體,用來描述一個顯示器的像素分辨率。這個結構體包含了兩個名爲width和height的儲存屬性。儲存屬性是捆綁和儲存在類或結構體中的常量或變量。當這兩個屬性被初始化爲整數0的時候,它們會被推斷爲Int類型。個名爲VideoMode的類,用來描述一個視頻顯示器的特定模式。這個類包含了四個儲存屬性變量。第一個是分辨率,它被初始化爲一個新的Resolution結構體的實例,具備Resolution的屬性類型。新VideoMode實例同時還會初始化其它三個屬性,它們分別是,初始值爲false(意爲「non-interlaced video」)的inteflaced,回放幀率初始值爲0.0的frameRate和值爲可選String的name。name屬性會被自動賦予一個默認值nil,意爲「沒有name值」,因它是一個可選類型。
類和結構體實例
Resolution結構體和VideoMode類的定義僅描述了什麼是Resolution和VideoMode。它們並無描述一個特定的分辨率(resolution)或者視頻模式(video mode)。爲了描述一個特定的分辨率或者視頻模式,咱們須要建立一個它們的實例。以下
let someResolution = Resolution() let someVideoMode = VideoMode()
過這種方式所建立的類或者結構體實例,其屬均會被初始化爲默認值。
屬性訪問
使用點語法訪問實例中所含有的屬性。其語法規則是,實例名後面緊跟屬性名,二者經過點號(.)鏈接:
println("The width of someResolution is \(someResolution.width)")
你也能夠訪問子屬性,如何VideoMode中Resolution屬性的width屬性:
println("The width of someVideoMode is \(someVideoMode.resolution.width)")
你也可使用點語法爲屬性變量賦值
someVideoMode.resolution.width = 12880 println("The width of someVideoMode is now \(someVideoMode.resolution.width)")
注意:與 Objective-C 語言不一樣的是,Swift 容許直接設置結構體屬性的子屬性。上面的最後一個例子,就是直接設置了someVideoMode中resolution屬性的width這個子屬性,以上操做並不須要重新設置resolution屬性。
逐個成員初始化器的結構類型
全部結構體都有一個自動生成的成員逐一初始化方法,用於初始化新結構體實例中成員的屬性。新實例中各個屬性的初始值能夠經過屬性的名稱傳遞到成員逐一初始化器之中:
let vga = resolution(width:640, heigth: 480)
與結構體不一樣,類實例沒有默認的成員逐一初始化器。
結構體和枚舉是值類型
個值類型是一個值,當它被分配給一個變量或常量時,或當它被傳遞給函數時,它的值是被複制的,這意味着它們的實例,以及實例中所包含的任何值類型屬性,在代碼中傳遞的時候都會被複制。
let hd = Resolution(width: 1920, height: 1080) var cinema = hd
在以上示例中,聲明瞭一個名爲hd的常量,其值爲一個初始化爲全高清視頻分辨率(1920 像素寬,1080 像素高)的Resolution實例。
而後示例中又聲明瞭一個名爲cinema的變量,其值爲以前聲明的hd。由於Resolution是一個結構體,因此cinema的值實際上是hd的一個拷貝副本,而不是hd自己。儘管hd和cinema有着相同的寬(width)和高(height)屬性,可是在後臺中,它們是兩個徹底不一樣的實例。
類是引用類型
與值類型不一樣,引用類型在被賦予到一個變量,常量或者被傳遞到一個函數時,操做的並非其拷貝。所以,引用的是已存在的實例自己而不是其拷貝
恆等運算符
由於類是引用類型,有可能有多個常量和變量在後臺同時引用某一個類實例。若是可以斷定兩個常量或者變量是否引用同一個類實例將會頗有幫助。爲了達到這個目的,Swift 內建了兩個恆等運算符:
等價於 ( === )
不等價於 ( !== )
if tenEighty === alsoTenTighty { println("tenTighty and alsoTenEighty refer to the same Resolution instance.") }
指針
若是你有 C,C++ 或者 Objective-C 語言的經驗,那麼你也許會知道這些語言使用指針來引用內存中的地址。一個 Swift 常量或者變量引用一個引用類型的實例與C語言中的指針相似,不一樣的是並不直接指向內存中的某個地址,並且也不要求你使用星號(*)來代表你在建立一個引用。Swift 中這些引用與其它的常量或變量的定義方式相同。