天天看點

Swift之枚舉類型&結構體枚舉類型結構體

枚舉類型

枚舉類型的介紹

概念介紹

  • 枚舉定義了一個通用類型的一組相關的值,使你可以在你的代碼中以一個安全的方式來使用這些值。
  • 在 C/OC 語言中枚舉指定相關名稱為一組整型值
  • Swift 中的枚舉更加靈活,不必給每一個枚舉成員提供一個值.也可以提供一個值是字元串,一個字元,或是一個整型值或浮點值

    枚舉類型的文法

  • 使用enum關鍵詞并且把它們的整個定義放在一對大括号内
// 1.枚舉類型的指派
enum CompassPoint : Int {
  case North = 1
  case South = 2
  case East = 3
  case West = 4
}
enum Planet {
  case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}
           

枚舉類型的定義

  • 以下是指南針四個方向的一個例子
  • case關鍵詞表明新的一行成員值将被定義
  • 不像 C 和 Objective-C 一樣,Swift 的枚舉成員在被建立時不會被賦予一個預設的整數值
  • 在上面的CompassPoints例子中,North,South,East和West不是隐式的等于0,1,2和3
  • 定義方式二:多個成員值可以出現在同一行上
// 2.枚舉類型的使用
let p = Planet(rawValue: 3)
if let p = p {
    switch p {
    case .Mercury:
        print("Mercury")
    case .Venus:
        print("Venus")
    case .Earth:
        print("Mercury")
    case .Mars:
        print("Mars")
    case .Jupiter:
        print("Jupiter")
    case .Saturn:
        print("Saturn")
    case .Uranus:
        print("Uranus")
    case .Neptune:
        print("Neptune")
    }
}
           

給枚舉類型指派

  • 枚舉類型指派可以是字元串/字元/整型/浮點型
  • 注意如果有給枚舉類型指派,則必須在枚舉類型後面明确說明具體的類型
  • 1.枚舉類型的指派
  • 2.枚舉類型的使用

結構體

結構體的介紹

概念介紹

  • 結構體(struct)是由一系列具有相同類型或不同類型的資料構成的資料集合
  • 結構體(struct)指的是一種資料結構
  • 結構體是值類型,在方法中傳遞時是值傳遞
  • 結構的定義格式

結構的定義格式

struct 結構體名稱 {
    // 屬性和方法
}
           

為什麼需要結構體?

先來看一個例子

  • 我們要計算平面坐标裡某個點距點Center的距離是否小于200
  • 算起來很簡單,勾股定理就搞定了:
    Swift之枚舉類型&結構體枚舉類型結構體

  • 其中sqrt(n)用來計算n的平方根
  • pow(x, n)用來計算x的n次方
let centerX : Double = 100
let centerY : Double = 100

func inRange(x : Double, y : Double) -> Bool {
    let disX = x - centerX
    let disY = y - centerX

    let dis = sqrt(pow(disX, 2) + pow(disY, 2))

    return dis < 200
}

let x : Double = 100
let y : Double = 1000

inRange(x, y: y)
           

問題

  • 但是這樣有一個不足,當我們需要比較很多個點和Center的距離的時候,這些數字并不能明确告訴我們它們代表的位置的意義,甚至我們都無法知道它們代表一個數字。
  • 如果我們可以像這樣來比較位置:
  • 相比數字,它們看上去就會直覺的多
  • 而這,就是我們需要自定義struct類型最直接的原因
inRange(location1)
inRange(myHome)
           
  • 使用結構進行改進
// 初始化結構體
struct Location {
    var x : Double
    var y : Double
}
// 建立結構體
let location = Location(x: 90, y: 90)
// 優化剛才的方法
func inRange(location : Location) -> Bool {
    let disX = location.x - centerX
    let disY = location.y - centerY
    let dis = sqrt(pow(disX, 2) + pow(disY, 2))
    return dis < 200
}
inRange(location)
           

結構體的增強

  • 擴充構造函數
  • 預設情況下建立Location時使用Location(x: x值, y: y值)
  • 但是為了讓我們在使用結構體時更加的靈活,swift還可以對構造函數進行擴充

    擴充的注意點

  • 在擴充的構造函數中必須保證成員變量是有值的
  • 擴充的構造函數會覆寫原有的構造函數
struct Location {
    var x : Double
    var y : Double
    init(x : Double, y : Double) {
        self.x = x
        self.y = y
    }
    init(xyString : String) {
        let strs = xyString.componentsSeparatedByString(",")
        x = Double(strs.first!)!
        y = Double(strs.last!)!
    }
}
let location = Location(x: 100, y: 100)
let location1 = Location(xyString: "100,100")
           
  • 為結構體擴充方法
  • 為了讓結構體使用更加靈活,swift的結構體中可以擴充方法
  • 例子:為了Location結構體擴充兩個方法
  • 向水準方向移動的方法
  • 向垂直方向移動的方法
struct Location {
    var x : Double
    var y : Double
    init(x : Double, y : Double) {
        self.x = x
        self.y = y
    }
    init(xyString : String) {
        let strs = xyString.componentsSeparatedByString(",")
        x = Double(strs.first!)!
        y = Double(strs.last!)!
    }
    mutating func moveH(x : Double) {
        self.x += x
    }
    mutating func moveV(y : Double) {
        self.y += y
    }
}
           

注意:

  • 如果我們使用的Location不是自己定義的,但是我們仍舊希望在自己的項目裡擴充Location的操作
  • Swift也能幫我們達成,這個機制,叫做extension
extension Location {
    mutating func moveH(x : Double) {
        self.x += x
    }

    mutating func moveV(y : Double) {
        self.y += y
    }
}
           

該轉載文章位址:https://www.cnblogs.com/chenjianjian/p/5457550.html

繼續閱讀