Ch09. 類別、結構與列舉
9.1 類別與結構的比較 類別與結構的相似之處除了可以定義屬性與功能外,還可以使用 索引存取屬性值、定義初始器來初始屬性、延展預設實作的功能 以及遵從某一協定提供某一形式的標準功能。
類別的定義的語法如下: class name { //類別的定義從此處開始 } 結構的宣告語法如下: struct name { //結構的定義從此處開始
9.1.1 值型態 結構與列舉是屬於值型態 (value type) 的資料。 9.1.1 值型態 結構與列舉是屬於值型態 (value type) 的資料。 當一結構或列舉指定給另一結構或列舉時,若其中有一所屬的資 料改變,另一個是不會受影響,因為它們各自佔不同的記憶體空 間。
範例程式 // value type struct Point { var x = 0 var y = 0 } var onePoint = Point() var anotherPoint = onePoint print("onePoint.x = \(onePoint.x)") print("onePoint.y = \(onePoint.y)") print("anotherPoint.x = \(anotherPoint.x)") print("anotherPoint.y = \(anotherPoint.y)") anotherPoint.x = 10 anotherPoint.y = 10 print("\n將原點座標改為(10, 10)")
輸出結果 onePoint.x = 0 onePoint.y = 0 anotherPoint.x = 0 anotherPoint.y = 0 將原點座標改為(10, 10) anotherPoint.x = 10 anotherPoint.y = 10
9.1.2 參考型態 不同於結構與列舉,類別是屬於參考型態 (reference type) 的資料。 9.1.2 參考型態 不同於結構與列舉,類別是屬於參考型態 (reference type) 的資料。 當一類別指定給另一類別時,若其中有一所屬的資料改變,另一 個也會受影響,因為它們參考同一個類別,
範例程式 // reference type class Rectangle { var width = 0.0 var height = 0.0 } var oneRectangle = Rectangle() var anotherRectangle = oneRectangle print("oneRectangle.width = \(oneRectangle.width)") print("oneRectangle.height = \(oneRectangle.height)") print("anotherRectangle.width = \(anotherRectangle.width)") print("anotherRectangle.height = \(anotherRectangle.height)") anotherRectangle.width = 50 anotherRectangle.height = 80 print("\n將寬與高改為(50, 80)") print(“anotherRectangle.width = \(anotherRectangle.width)")
輸出結果 oneRectangle.width = 0.0 oneRectangle.height = 0.0 anotherRectangle.width = 0.0 anotherRectangle.height = 0.0 將寬與高改為(50, 80) oneRectangle.width = 50.0 oneRectangle.height = 80.0 anotherRectangle.width = 50.0 anotherRectangle.height = 80.0
9.1.3 === 與 !== 運算子 類別是參考型態,所以有可能多個常數或變數參考到相同的類別 物件。 9.1.3 === 與 !== 運算子 類別是參考型態,所以有可能多個常數或變數參考到相同的類別 物件。 這裏將介紹兩個判斷變數或常數是否參考相同類別的運算子,分 別是相同運算子(===)與不相同運算子 (!==)。
範例程式part1 // === and !== operator class Rectangle { var width = 10 var height = 20 } var oneRectangle = Rectangle() print("oneRectangle.width = \(oneRectangle.width)") print("oneRectangle.height = \(oneRectangle.height)") var anotherRectangle = Rectangle() anotherRectangle.width = 50 anotherRectangle.height = 80 print("anotherRectangle.width = \(anotherRectangle.width)") print("anotherRectangle.height = \(anotherRectangle.height)") if oneRectangle === anotherRectangle { print("the same") } else { print("not the same")
範例程式part2 //------------------------------------- print() anotherRectangle = oneRectangle anotherRectangle.width = 20 anotherRectangle.height = 10 print("oneRectangle.width = \(oneRectangle.width)") print("oneRectangle.height = \(oneRectangle.height)") print("anotherRectangle.width = \(anotherRectangle.width)") print("anotherRectangle.height = \(anotherRectangle.height)") if oneRectangle === anotherRectangle { print("the same") } else { print("not the same") }
輸出結果 oneRectangle.width = 10 oneRectangle.height = 20 anotherRectangle.width = 50 anotherRectangle.height = 80 not the same oneRectangle.width = 20 oneRectangle.height = 10 anotherRectangle.width = 20 anotherRectangle.height = 10 the same
9.2 列舉的語法 語法是以enum為開頭,之後以左、右大括號括起列舉值,並在 列舉值名稱前加上case,即可完成。 如: 9.2 列舉的語法 語法是以enum為開頭,之後以左、右大括號括起列舉值,並在 列舉值名稱前加上case,即可完成。 如: enum people { case freshman case sophomore case junior case senior }
9.2.1 在switch敘述中使用列舉值 可以定義一屬於此列舉的變數,並利用switch敘述加以判斷。
範例程式 enum people { case freshman, sophomore, junior, senior } let status = people.junior switch status { case .freshman: print("你是大一生") case .sophomore: print("你是大二生") case .junior: print("你是大三生") case .senior: print("你是大四生")
輸出結果 你是大三生
9.2.2 關連值 在列舉值中我們可以給予其關連值 (associated value) 。
範例程式 //associated value enum mobile { case iOS(String) case Android(String, String) case Windows(String) } var myMobile = mobile.iOS("iPhone") switch myMobile { case .iOS(let mobile1): print("使用iOS系統, 你可以選擇: \(mobile1)") case .Android(let mobile3, let mobile4): print("使用 Android 系統, 你可以選擇: \(mobile3) 或 \(mobile4) 或其它") case .Windows(let mobile6): print("使用 Windows Phone, 你可以選擇: \(mobile6)")
輸出結果 使用iOS系統, 你可以選擇: iPhone
9.2.3 rawValue 在列舉中Swift 3提供rawValue 函式,用以告訴列舉值的原始值 (raw value),亦即是預設值(default value)。
範例程式 enum people: Int { case freshman=1, sophomore, junior, senior } let status = people.senior.rawValue print(status)
輸出結果 4