Swift4 枚舉,自學筆記

来源:https://www.cnblogs.com/ccjoy/archive/2018/04/03/8711202.html
-Advertisement-
Play Games

枚舉 蘋果官方文檔 "枚舉" 蘋果官方文檔中文翻譯 "枚舉" 枚舉語法 使用Switch語句來匹配枚舉值 如果不能為所有枚舉成員都提供一個 case,那你也可以提供一個==default==情況來包含那些不能被明確寫出的成員: 關聯值 如果對於一個枚舉成員的所有的相關值都被提取為常量,或如果都被提取 ...


枚舉

蘋果官方文檔 枚舉

蘋果官方文檔中文翻譯 枚舉

枚舉語法

enum SomeEnumeration {
    // enumeration definition goes here
}
enum CompassPoint {
    case north
    case south
    case east
    case west
}

var directionToHead = CompassPoint.west

directionToHead = .east
enum Planet {
    case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}

使用Switch語句來匹配枚舉值

directionToHead = .south
switch directionToHead {
    case .north:
        print("Lots of planets have a north")
    case .south:
        print("Watch out for penguins")
    case .east:
        print("Where the sun rises")
    case .west:
        print("Where the skies are blue")
}
// prints "Watch out for penguins"

如果不能為所有枚舉成員都提供一個 case,那你也可以提供一個==default==情況來包含那些不能被明確寫出的成員:

let somePlanet = Planet.earth
switch somePlanet {
    case.earth:
        print("Mostly harmless")
    default:
        print("Not a safe place for humans")
}
// Prints "Mostly harmless"

關聯值

enum Barcode {
    case upc(Int, Int, Int, Int)
    case qrCode(String)
}
var productBarcode = Barcode.upc(8, 85909, 51226, 3)
productBarcode = .qrCode("ABCDEFGHIJKLMNOP")

switch productBarcode {
    case .upc(let numberSystem, let manufacturer, let product, let check):
        print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")
    case .qrCode(let productCode):
        print("QR code: \(productCode).")
}
// Prints "QR code: ABCDEFGHIJKLMNOP."

如果對於一個枚舉成員的所有的相關值都被提取為常量,或如果都被提取為變數,為了簡潔,你可以用一個單獨的 var或 let在成員名稱前標註:

switch productBarcode {
case let .upc(numberSystem, manufacturer, product, check):
    print("UPC : \(numberSystem), \(manufacturer), \(product), \(check).")
case let .qrCode(productCode):
    print("QR code: \(productCode).")
}
// Prints "QR code: ABCDEFGHIJKLMNOP."

原始值

枚舉成員可以用相同類型的預設值預先填充(稱為原始值)。

enum ASCIIControlCharacter: Character {
    case tab = "\t"
    case lineFeed = "\n"
    case carriageReturn = "\r"
}

隱式指定的原始值

當你在操作存儲整數或字元串原始值枚舉的時候,你不必顯式地給每一個成員都分配一個原始值。當你沒有分配時,Swift 將會自動為你分配值。

enum Planet: Int {
    case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}

enum CompassPoint: String {
    case north, south, east, west
}

let earthsOrder = Planet.Earth.rawValue
    // earthsOrder is 3
 
let sunsetDirection = CompassPoint.west.rawValue
    // sunsetDirection is "west"

從原始值初始化

用原始值類型來定義一個枚舉,那麼枚舉就會自動收到一個可以接受原始值類型的值的初始化器(叫做==rawValue==的形式參數)然後返回一個枚舉成員或者 nil

let possiblePlanet = Planet(rawValue: 7)
    // possiblePlanet is of type Planet? and equals Planet.Uranus

原始值初始化器是一個可失敗初始化器

let positionToFind = 11
if let somePlanet = Planet(rawValue: positionToFind) {
    switch somePlanet {
    case .earth:
        print("Mostly harmless")
    default:
        print("Not a safe place for humans")
    }
} else {
    print("There isn't a planet at position \(positionToFind)")
}
// Prints "There isn't a planet at position 11"

遞歸枚舉

遞歸枚舉是擁有另一個枚舉作為枚舉成員關聯值的枚舉。在聲明枚舉成員之前使用==indirect==關鍵字來明確它是遞歸的。

enum ArithmeticExpression {
    case number(Int)
    indirect case addition(ArithmeticExpression, ArithmeticExpression)
    indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}

可以在枚舉之前寫==indirect==來讓整個枚舉成員在需要時可以遞歸:

indirect enum ArithmeticExpression {
    case number(Int)
    case addition(ArithmeticExpression, ArithmeticExpression)
    case multiplication(ArithmeticExpression, ArithmeticExpression)
}
let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let product = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2))
func evaluate(_ expression: ArithmeticExpression) -> Int {
    switch expression {
    case let .number(value):
        return value
    case let .addition(left, right):
        return evaluate(left) + evaluate(right)
    case let .multiplication(left, right):
        return evaluate(left) * evaluate(right)
    }
}
 
print(evaluate(product))
// Prints "18"

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、Python介紹 python的創始人為吉多·範羅蘇姆(Guido van Rossum),中文名為龜叔。1989年的聖誕節期間,為了在 阿姆斯特丹打發時間,決心開發一個系的腳本解釋程式,作為ABC語言的一種繼承。 python名字來自龜叔所摯愛的電視劇Monty Python’s Flying ...
  • ♦ 當java創建一個對象時,先為該對象的所以實例變數分配棧記憶體(已載入類的前提),然後執行實例變數的初始化,其初始化順序是,先執行初始化塊 或 聲明實例變數時的初始值(具體執行順序根據源碼實際的排序順序而定),然後再執行構造器聲明的初始值。 ♦ 靜態初始化塊類似,jvm第一次主動使用某個類時,會在 ...
  • 文件名全小寫,可使用下劃線 包應該是簡短的、小寫的名字。如果下劃線可以改善可讀性可以加入。如mypackage。 模塊與包的規範同。如mymodule。 類總是使用首字母大寫單詞串。如MyClass。內部類可以使用額外的前導下劃線。 函數&方法函數名應該為小寫,可以用下劃線風格單詞以增加可讀性。如: ...
  • 導語:設計模式是無數位農前人在實際的生產項目中經過不斷的踩坑、爬坑、修坑的經歷總結出來的經驗教訓,經過抽象之後表達成的概念。能夠幫助後來的設計者避免重覆同樣的錯誤或者彎路。 我抽空整理了一下設計模式,用自己的話總結了一下,自認為通俗易懂。 簡單工廠模式: 包括三種角色,抽象產品、具體產品和工廠角色。 ...
  • 內層函數對外層函數,非全局變數的引用。 判斷閉包函數:函數名.__closure__(),返回的值中有cell這個元素表示該函數為閉包函數。 閉包函數的機制:當函數開始執行時,如果遇到了閉包,在記憶體當中會為閉包開闢一個記憶體空間,用於將閉包中的變數等值放入其中,並不會隨著函數的執行完畢而消失。 ...
  • Description Pine開始了從S地到T地的征途。 從S地到T地的路可以劃分成n段,相鄰兩段路的分界點設有休息站。 Pine計劃用m天到達T地。除第m天外,每一天晚上Pine都必須在休息站過夜。所以,一段路必須在同一天中走完。 Pine希望每一天走的路長度儘可能相近,所以他希望每一天走的路的 ...
  • pylint是VScode中python自帶的插件,可以幫助代碼規範,美觀。 但是有些報錯是你不想看到的,你可以選擇性的忽略。 例如,在re.compile()中,可以添加參數 使`.` 匹配任意字元。而pylint會一直報錯不存在這種方法,導致無法運行。在Pycharm中則不會出現這種問題。 想要 ...
  • 上一節課給大家講了Python的數值和字元串 在編寫程式的過程中,經常會遇到使用很多數據量的情況,處理每一個數據量都要有一個相對應的變數,如果每一個變數都要單獨進行定義則很繁瑣,使用列表就可以解決這種問題 Python的數值類型List,也就是列表 Python的列表比較類似與其他語言的數組概念,但 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...