Swift5.1 學習(三)

枚舉

  • 基本用法:
  • 關聯值:有時會將枚舉的成員值跟其他類型的關聯存儲在一起老翘,會非常有用
enum Score {
    case points(Int)
    case grade(Character)
}
var score = Score.points(96)
score = .grade(“A”)
switch score {
case let .points(i):
    print(i, “points”)
case let .grade(i):
    print(“grade”,i)
}
  • 原始值:枚舉成員可以使用相同類型的默認值預先關聯

    enum PokerSuit : Character {
        case spade = “黑桃”
        case heart = “紅心”
        case club =.“梅花”
        case diamond = “紅鉆”
    }
    print(PokerSuit.spade.rawValue)
    // 隱式原始值:如果枚舉的原始值類型是Int、String類型冲簿,swift會自動分配原始值涣旨;String類型按照定義名稱設置為原始值氏仗;Int類型和c語音設置一樣
    
  • 遞歸枚舉

    indirect enum ArithExpr{
        case number(Int)
        case sum(ArithExpr, ArithExpr)
        case difference(ArithExpr,ArithExpr)
    }
    let five = ArithExpr.number(5)
    let four = ArithExpr.number(4)
    let two = ArithExpr.number(2)
    let sum = ArithExpr.sum(five, four)
    let difference = ArithExpr.difference(sum, two)
    
  • MemoryLayout :獲取數據類型占用內存大小

    var age = 10
    MemoryLayout.size(ofValue: age)
    // 分配占用的空間大小
    MemoryLayout<Int>.size
    // 分配占用的空間大小    
    MemoryLayout<Int>stride
    // 內存對齊    
    MemoryLayout<Int>.alignment
    // 這個只占一個字節(jié)(設定了原始值的也只占1個字節(jié),只有關聯值才會存儲進去)
    enum season {case spring,summer,autumn,winter}
    

可選項

  • 定義:又稱可選類型我碟,允許定義的數據返回nil(意思就是原本所有的數據類型都不能設置為nil)放案,只需要在定義類型后面補充個 (?)即可矫俺,可選項類型默認有初始值nil

    EX1:
    var name :String? = “Jack”
    name = nil
    
    EX2:
    var array = [10,20,30,40]
    func get(_ index:Int) ->Int? {
        if (index < 0 || index >= array.count) {
            return nil
        }
        return array[index]
    }
    
  • 強制解包:
    1吱殉、可選值本質是對其他類型的一個包裝掸冤,可以將它理解為一個盒子。
    2友雳、如果是nil代表的是一個空盒子稿湿,如果不是nil盒子內裝的就是被包裝的數據類型。
    3押赊、如果要從可選項中取出被包裝的數據饺藤,則需要在可選項后使用“!”進行強制解包。
    4流礁、這個過程不會改變原本的可選值涕俗,只是拿出里面包裝的類型使用
    5、對nil(空盒子)進行強制解包崇棠,運行時會報錯

  • 可選項綁定:
    1咽袜、可以判斷可選項是否有值
    2、如果包含則自動解包賦值給let 或者 var并返回true枕稀,否則返回false
    3、while也可以使用

    if let number = Int(“123”) {
        print(\(number))
        // 結果是123谜嫉,并非Optional(123)
    }else {
        xxx
    }
    
    // 可選項綁定判斷不能用&& 萎坷,需要用逗號(,)
    if let first = Int(“10”), let second = Int(“20”), (first < second && second < 100) {
        xxx
    }
    
  • 空合并運算符(??)
    a ?? b
    條件說明:
    1沐兰、a一定是可選項哆档,b不一定是可選項
    2、a如果不是空盒子(nil)則返回a住闯,否則返回b
    3瓜浸、如果b不是可選項,返回a的時候比原,會自動解包
    4插佛、b和a的類型需要相同,如果b不是可選值量窘,則要和a解包后的格式相同
    5雇寇、多個運算符,數據類型只看最后一個數值蚌铜,再從左到右運算
    6锨侯、補充:字典根據key取出來的數據是可選類型;數組根據下標取出數據是真實數據類型冬殃,因此數組需要做防止越界處理

    // ??與if let同用
    let a :Int? = nil
    let b :Int? = 2
    if let c = a ?? b {
        // 類似if a!=nil || b != nil
    }
    let a :Int? = nil
    let b :Int? = 2
    if let c = a , let d = b {
        // 類似if a!=nil && b != nil
    }
    
    
  • guard語句
    說明:
    1囚痴、當條件為false進入guard條件語句,否則跳過审葬。
    2深滚、適合用于提前退出
    3骂束、使用guard可選項綁定的時候,綁定的數值可用于判斷語句外部
    guard 條件 else { // 一定要退出當前作用域:reutrn,break,continue,throw error } // 可用于判斷登陸用戶名以及密碼模塊

  • 隱式解包
    說明:
    1成箫、某些情況下展箱,可選項一旦被設定值后,就確定一定有值蹬昌;
    2混驰、如果確定有值,我們去掉對該值的檢查皂贩,也不必每次都強制解包
    3栖榨、使用場景主要是確定對方傳給我們值,如果是nil不做處理
    ```
    // num1本質還是可選項類型
    let num1:Int! = 10
    let num2 :Int = num1

      // ps:可選項是空值使用解包還是會報錯
      let num1: Int! = nil
      let num2:Int = num1
      ```
    
  • 字符串插值
    var age :Int? = 10 print(“my age is \(age)”) // 這種寫法是會有?的 // 消除?的三種方法 // ?:解包:my age is 10 print(“my age is \(age!)”) // ?:將字符描述打印出來:my age is optional(10) print(“my age is \(String(describing: age))”) // ?:空合并運算符:my age is 10 print(“my age is \(age??0)”)

  • 多重可選項
    ```
    // ?
    let num1 :Int? = 10
    let num2 :Int?? = num1
    let num3 :Int?? = 10
    // 解釋:num2 == num3 都是包了兩層的optional

      // ?
      let num1 :Int? = nil
      let num2 :Int?? = num1
      let num3 :Int?? = nil
      // 解釋:num2 明刷!= num3 num3實際是只包了一層的nil
      
      // ??可以使用lldb指令查看區(qū)別:斷點處是輸入 help frame variable -R  或者簡寫(fr v -R)查看
      ```
    
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末婴栽,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子辈末,更是在濱河造成了極大的恐慌愚争,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件挤聘,死亡現場離奇詭異轰枝,居然都是意外死亡,警方通過查閱死者的電腦和手機组去,發(fā)現死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門鞍陨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人从隆,你說我怎么就攤上這事诚撵。” “怎么了键闺?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵寿烟,是天一觀的道長。 經常有香客問我艾杏,道長韧衣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任购桑,我火速辦了婚禮畅铭,結果婚禮上,老公的妹妹穿的比我還像新娘勃蜘。我一直安慰自己硕噩,他們只是感情好,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布缭贡。 她就那樣靜靜地躺著炉擅,像睡著了一般辉懒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谍失,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天眶俩,我揣著相機與錄音,去河邊找鬼快鱼。 笑死颠印,一個胖子當著我的面吹牛,可吹牛的內容都是我干的抹竹。 我是一名探鬼主播线罕,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼窃判!你這毒婦竟也來了钞楼?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤袄琳,失蹤者是張志新(化名)和其女友劉穎询件,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體跨蟹,經...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡雳殊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了窗轩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡座咆,死狀恐怖痢艺,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情介陶,我是刑警寧澤堤舒,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站哺呜,受9級特大地震影響舌缤,放射性物質發(fā)生泄漏。R本人自食惡果不足惜某残,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一国撵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧玻墅,春花似錦介牙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽囚似。三九已至,卻和暖如春线得,著一層夾襖步出監(jiān)牢的瞬間饶唤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工贯钩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留募狂,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓魏保,卻偏偏與公主長得像熬尺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子谓罗,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內容