Swift 入門指南 V1.00 - 單元 10 - 屬性與方法




類別 (class) 跟結構 (structure) 在定義上大致相同,這裡先以結構為例說明如何定義屬性 (property) 及方法 (method)



屬性定義在 struct 的下方,可用 var 定義為變數 (variable) 或用 let 定義為常數 (constant) ,至於方法的定義就跟函數 (function) 一樣,舉例如下


struct StructDemo {
   // 變數的儲存性屬性
   var a: Int
   // 常數的儲存性屬性
   let b: Int
 
   // 第一個實體方法
   func doSomething() -> Int {
      // 回傳兩個屬性的相加值
      return a + b
   }
 
   // 第二個實體方法
   func doSomething2(a: Int, b: Int) -> Int {
      // 回傳兩個參數的相加值
      return a + b
   }
 
   // 第三個實體方法
   mutating func doSomething3(a: Int) {
      // 將屬性 a 加上參數 a
      self.a += a
   }
}
 
var d = StructDemo(a: 11, b: 22)
d.doSomething()
d.a = 33
d.doSomething()
d.doSomething2(55, b: 66)
d.doSomething3()
d.a
d.b

StructDemo 中先宣告兩個儲存性屬性 (stored property) ,一個是常數,另一個是變數


// 變數的儲存性屬性
var a: Int
// 常數的儲存性屬性
let b: Int

直接宣告出來的是儲存型屬性,另可定義計算型屬性 (computed property) 。

下面定義三個方法都是實體方法 (instance method) ,這是建立物件實體 (instance) 後才能使用的方法


// 第一個實體方法
func doSomething() -> Int {
   // 回傳兩個屬性的相加值
   return a + b
}

doSomething() 回傳兩個屬性的相加值,下面的 doSomething2() 則回傳兩個參數 (property) 的相加值


// 第二個實體方法
func doSomething2(a: Int, b: Int) -> Int {
   // 回傳兩個參數的相加值
   return a + b
}

doSomething2() 同時也說明如果參數跟屬性的名稱相同的情況,當兩者名稱相同時,方法大括弧內就以參數名稱為優先。下面的 doSomething3() 示範兩者相同時,要繼續使用屬性的話,屬性前就要加上關鍵字 self


// 第三個實體方法
mutating func doSomething3(a: Int) {
   // 將屬性 a 加上參數 a
   self.a += a
}

同時,因為 doSomething3() 修改屬性值,所以 func 前要加上 mutating


將以上程式碼輸入到 Playground ,結果如下



呼叫方法時,第一個參數的識別名稱可以不用寫出來。

儲存性屬性也可以直接指派初值,這樣就不必再建立物件實體時提供參數,例如


struct StructDemo2 {
   var a = 2
   let b = 5
}
 
var d2 = StructDemo2()
d2.a = 24
var d3 = StructDemo2(a: 1, b: 2)
d3.a = 6

輸入到 Playground ,結果如下



另可用關鍵字 static 定義結構的型態屬性 (type property) 及型態方法 (type method) ,例如


struct StructDemo3 {
   // 型態屬性
   static var count = 0
 
   // 型態方法
   static func doSomething() {
      count += 1
   }
}
 
StructDemo3.count
StructDemo3.doSomething()
StructDemo3.doSomething()
StructDemo3.doSomething()
StructDemo3.count

類別中定義型態屬性及類別方法使用關鍵字 class

型態屬性及型態方法都直接用型態名稱呼叫,輸入到 Playground ,結果如下



下一個單元繼續討論建構子 (initializer) 及解構子 (deinitializer) ,前者是實體物件的初始化過程,後者則是結束物件的過程。


中英文術語對照


類別class
結構structure
屬性property
方法method
變數variable
常數constant
函數function
儲存性屬性stored property
計算型屬性computed property
實體方法instance method
實體instance
型態屬性type property
型態方法type method
建構子initializer
解構子deinitializer

沒有留言: