394,Swift中的枚舉中的計(jì)算屬性和方法(面試點(diǎn):方法可以寫在case下面,也可以寫在enum中 switch self 對方法可以添加mutating 這樣可以改變隱藏參數(shù)self的cas...

方法和屬性(Methods and properties)

你也可以在enum中像這樣定義方法:

enum Wearable {
    enum Weight: Int {
        case Light = 1
    }
    enum Armor: Int {
        case Light = 2
    }
    case Helmet(weight: Weight, armor: Armor)
        func attributes() -> (weight: Int, armor: Int) {
       switch self {
             case .Helmet(let w, let a): return (weight: w.rawValue * 2, armor: w.rawValue * 4)
       }
    }
}
let woodenHelmetProps = Wearable.Helmet(weight: .Light, armor: .Light).attributes()
print (woodenHelmetProps)
// prints "(2, 4)"

枚舉中的方法為每一個(gè)enum case而“生”。所以倘若想要在特定情況執(zhí)行特定代碼的話,你需要分支處理或采用switch語句來明確正確的代碼路徑。

enum Device { 
    case iPad, iPhone, AppleTV, AppleWatch 
    func introduced() -> String {
       switch self {
         case AppleTV: return "\(self) was introduced 2006"
         case iPhone: return "\(self) was introduced 2007"
         case iPad: return "\(self) was introduced 2010"
         case AppleWatch: return "\(self) was introduced 2014"
       }
    }
}
print (Device.iPhone.introduced())
// prints: "iPhone was introduced 2007"

屬性(Properties)

盡管增加一個(gè)存儲(chǔ)屬性到枚舉中不被允許,但你依然能夠創(chuàng)建計(jì)算屬性。當(dāng)然,計(jì)算屬性的內(nèi)容都是建立在枚舉值下或者枚舉關(guān)聯(lián)值得到的。

enum Device {
  case iPad, iPhone
  var year: Int {
    switch self {
        case iPhone: return 2007
        case iPad: return 2010
     }
  }
}

靜態(tài)方法(Static Methods)

你也能夠?yàn)槊杜e創(chuàng)建一些靜態(tài)方法(static methods)。換言之通過一個(gè)非枚舉類型來創(chuàng)建一個(gè)枚舉。在這個(gè)示例中,我們需要考慮用戶有時(shí)將蘋果設(shè)備叫錯(cuò)的情況(比如AppleWatch叫成iWatch),需要返回一個(gè)合適的名稱。

enum Device { 
    case AppleWatch 
    static func fromSlang(term: String) -> Device? {
      if term == "iWatch" {
      return .AppleWatch
      }
      return nil
    }
}
print (Device.fromSlang("iWatch"))

可變方法(Mutating Methods)

方法可以聲明為mutating。這樣就允許改變隱藏參數(shù)selfcase值了

enum TriStateSwitch {
    case Off, Low, High
    mutating func next() {
    switch self {
    case Off:
        self = Low
    case Low:
        self = High
    case High:
        self = Off
    }
    }
}
var ovenLight = TriStateSwitch.Low
ovenLight.next()
// ovenLight 現(xiàn)在等于.On
ovenLight.next()
// ovenLight 現(xiàn)在等于.Off

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容