類和結構體都是多功能而且靈活的結構,它們可以作為構建塊(building block)在**中使用。你可以為類和結構體定義屬性和方法來擴充它們的功能。對於自定義類,swift不需要你建立單獨的介面和檔案來實現類和介面,你在乙個檔案中定義和實現類和結構體即可。
類和結構體有很多相似之處:
• 定義儲存值的屬性
• 定義方法提供功能
• 定義下標,通過下標語法訪問元素的值
• 定義初始化器來初始化狀態
• 可以服從特定的協議提供標準功能
類還有一些結構體沒有的功能:
• 繼承使得乙個類能夠繼承其他類的屬性
• 型別轉化能夠讓你在執行時檢查和解釋類例項的型別
• 類的解析(deinitializer)能夠釋放類例項分配到的任何資源
• 引用計數允許乙個類例項有乙個或者多個引用
相比於c語言,swift 的結構體強大了很多,可以有方法,構造方法等。使用struct關鍵字來定義乙個結構體,使用class關鍵字來定義乙個類,定義的主體位於乙個花括號中。語法:
struct structname
class
someclass
如: struct rect
struct resolution
class
videomode
結構體和類的定義中,由於建立了新的型別,所以類和結構體的名稱採用首字母大寫的駝峰標識,而屬性和方法則採用首字母小寫的駝峰標識。
let someresolutio = resolution()
let somevideomode = videomode()
這是最簡單的例項化方式,使用類或結構體的名字外加乙個括號即可。
我們採用「.」來訪問例項的屬性。如下面所示:
struct rect
//例項化:
var rect: rect = rect()
rect.height = 10.0
rect.width = 20.0
//為例項變數賦值
跟objective-c不一樣,swift可以讓你直接訪問屬性的屬性,如上面的videomode
這個類有乙個結構體例項,可以直接訪問這個例項的屬性。
somevideomode.resolution
.height = 960
somevideomode.resolution
.width = 1280
構造器的作用不是分配記憶體,而是系統給分配記憶體之後,自動呼叫構造器方法,進行初始化記憶體,初始化成員變數。所以,構造器主要分兩種,一種是構造結構體時指定所有成員變數的初始值,此時不用帶引數,如var rect: rect = rect()
;第二種是逐一成員構造器,因為成員變數在構造結構體的時候沒有初始化,如:
struct rect
var rect = rect(height: 10.0, width: 20.0) //注意,height和width的順序不能調換
值型別意味著在給乙個變數或者常量賦值或者傳遞給函式的時候採用的是拷貝的方式。在以前所接觸到的型別int、float、double、bool、string、array、dictionary
等都是值型別。在swift中所有的結構體和列舉型別都是結構體。可以看看以下示例:
var highresolution = resolution(width: 1920, height: 1080)
var cinema = highresolution
//改變cinema的乙個的屬性
cinema.width = 2048
//highresolution 的屬性並沒有改變,所以是值傳遞
print("highresolution: (width: \(highresolution.width), height: \(highresolution.height))")
輸出結果為:
highresolution: (width: 1920, height: 1080)
program ended with
exit code: 0
enum compasspoint
var currentdirection = compasspoint.east
var anotherdirection = currentdirection
anotherdirection = .west
if(currentdirection == .east)
輸出結果為:
current direction is still east
program ended with exit code: 0
說明列舉型別的賦值也是值傳遞,採用的是拷貝方式。
引用型別是當賦值給變數或者常量或者傳遞給函式時不會採用值拷貝,而是採用引用傳遞的方式,多個變數或者常量指向同乙個例項。
let teneighty = videomode()
teneighty.resolution = highresolution
teneighty.interlaced = true
teneighty.name = "1080i"
teneighty.framerate = 25.0
let alsoteneighty = teneighty
alsoteneighty.framerate = 30.0
print("the frame rate of the teneighty is \(teneighty.framerate)")
輸出結果為:
the frame rate of the teneighty is 30.0
program ended with exit code: 0
說明teneighty
和alsoteneighty
指向的是同乙個例項,所以是引用傳遞。
因為類是引用型別,所以存在著多個常量或者變數指向同乙個例項,那麼如何判斷它們是否指向同一變數呢?使用相等操作符 ===,這是連續三個等號組成的操作符。
如果指向同乙個例項,則是===,否則為!==
注意,該符號只能用於類的例項,不能用於結構體和其他值型別。
你可以使用類和結構體來自定義型別,在**中將其視為構建塊來使用。但是結構體例項是傳值,而類例項是傳引用。那麼如何在二者之間抉擇呢?這裡有乙個一般性的準則。當應用到以下條件時可以考慮建立結構體:
• 結構體的主要目的是封裝一些簡單的相關資料值
• 當賦值或者傳遞時希望這些封裝的值將會被拷貝而不是引用
• 由結構體儲存的值都值型別,它們更多是的是拷貝而不是引用
• 結構體不需要從其他型別繼承屬性
比如以下示例:
• 幾何圖形的尺寸
• 三維座標的點
......
.
其他情況下都可以考慮使用類。實際情況上,這就意味著大多數的自定義型別是類,而不是結構體。 結構體總結
結構體總結 共用體 聯合體 1.乙個結構變數的所佔記憶體空間大小,一般大於或者等於結構中所有成員變數大小之和,成員變數在結構體記憶體空間按照定義的順序依次儲存。2.共用體是將幾種不同型別的變數存放在同一段記憶體單元中。3.語法形式 union 共用體名共用體變數名 4.共用體與結構體的定義形式相似,...
結構體總結
1.結構體的定義 結構體是一些值得集合,這些值稱為成員變數,結構體的每個成員可以是不同型別的變數。2.結構體的宣告 結構體的名稱盡量做到容易理解,結構體的名稱可以省略但是不建議省略 在結構體裡可以放任何合法的內容,結構體內容 member 不能為空,這是在c語言中的要求 結構體變數 variable...
結構體總結
1.結構體和陣列的區別和聯絡 陣列 相同型別元素的集合 結構體 也是一些值的集合 稱為成員變數 每個成員可以是相同或不同的變數。2.結構體成員 可以是標量,陣列,指標,還可以是結構體。這裡補充一下,陣列的元素可以是陣列,就像二維陣列的元素可以看成一維陣列,任何陣列都可以看成是由一維陣列構成。3.結構...