Swift基礎(chǔ)語(yǔ)法(十五)字面量協(xié)議和模式匹配

Swift基礎(chǔ)語(yǔ)法文章匯總

主要內(nèi)容

  1. 字面量
  2. 模式匹配

1. 字面量

1.1 字面量類型

Swift提供了很多的字面量球涛,系統(tǒng)自帶的很多類型都通過(guò)遵守字面量協(xié)議來(lái)實(shí)現(xiàn)字面量直接初始化

常見字面量的默認(rèn)類型:

  • public typealias IntegerLiteralType = Int
  • public typealias FloatLiteralType = Double
  • public typealias BooleanLiteralType = Bool
  • public typealias StringLitteralType = String

修改字面量的默認(rèn)類型:

// 可以通過(guò)typealias修改字面量的默認(rèn)類型
typealias FloatLiteralType = Float
typealias IntegerLiteralType = UInt8
var age = 10 // UInt8
var height = 1.68 // Float

Swift自帶的絕大部分類型,都支持直接通過(guò)字面量進(jìn)行初始化,Bool、Int、Float、Double、String哭懈、Array、Dictionary茎用、Set遣总、 Optional等

1.2 字面量協(xié)議

常見字面量協(xié)議:

類型 協(xié)議
Bool : ExpressibleByBooleanLiteral
Int : ExpressibleByIntegerLiteral
Float、Double : ExpressibleByIntegerLiteral轨功、ExpressibleByFloatLiteral
Dictionary : ExpressibleByDictionaryLiteral
String : ExpressibleByStringLiteral
Array旭斥、Set : ExpressibleByArrayLiteral
Optional : Expressibl

應(yīng)用:

extension Int : ExpressibleByBooleanLiteral {
    public init(booleanLiteral value: Bool) {
        self = value ? 1 : 0
    }
}
var num: Int = true
print("WY:",num)//WY: 1

2. 模式匹配

模式是用于匹配的規(guī)則,比如switch的case夯辖、捕捉錯(cuò)誤的catch琉预、if\guard\while\for語(yǔ)句的條件等

模式種類:

  • 通配符模式(Wildcard Pattern)
  • 標(biāo)識(shí)符模式(Identifier Pattern)
  • 值綁定模式(Value-Binding Pattern)
  • 元組模式(Tuple Pattern)
  • 枚舉Case模式(Enumeration Case Pattern)
  • 可選模式(Optional Pattern)
  • 類型轉(zhuǎn)換模式(Type-Casting Pattern)
  • 表達(dá)式模式(Expression Pattern)

通配符模式:

  • _匹配任何值
  • _?匹配非nil值

標(biāo)識(shí)符模式:

  • 給對(duì)應(yīng)的變量、常量名賦值

值綁定模式:

//值綁定模式
let point = (3, 2)
switch point {
case let (x, y):
    print("The point is at (\(x), \(y)).")
}

元組模式:

//元組模式
func test1() {
    let name: String? = "jack"
    let age = 18
    let info: Any = [1, 2]
    switch (name, age, info) {
    case (_?, _ , _ as String):
        print("case")
    default:
        print("default")
    } // default
}

枚舉Case模式:

//枚舉Case模式
func test2() {
    let age = 2
    // 原來(lái)的寫法
    if age >= 0 && age <= 9 {
        print("[0, 9]")
    }
    // 枚舉Case模式
    if case 0...9 = age {
        print("[0, 9]")
    }
    guard case 0...9 = age else { return }
    print("[0, 9]")
    //等價(jià)switch case
    switch age {
    case 0...9: print("[0, 9]")
    default: break
    }
    //for case
    let ages: [Int?] = [2, 3, nil, 5]
    for case nil in ages {
        print("有nil值")
        break
    } // 有nil值
    
    let points = [(1, 0), (2, 1), (3, 0)]
    for (x, y) in points {
        print(x, y)
    }
    for (x, _) in points {
        print(x)
    }
    //帶0蒿褂,必須加case
    for case let (x, 0) in points {
        print(x)
    }
}
  • 這三者是等價(jià)的圆米,if case語(yǔ)句等價(jià)于只有1個(gè)case的switch的語(yǔ)句

可選模式:

//可選模式
func test3() {
    let age: Int? = 42
    if case .some(let x) = age {
        print(x)
    }
    if case let x? = age {
        print(x)
    }
}

類型轉(zhuǎn)換模式:

//類型轉(zhuǎn)換模式
func test4() {
    let num: Any = 6
    switch num {
    case is Int:
        // 編譯器雖然可以判斷Int型,依然認(rèn)為num是Any類型
        print("is Int", num)
        //此時(shí)就會(huì)直接強(qiáng)轉(zhuǎn)成Int型
        //case let n as Int:
        //    print("as Int", n + 1)
    default:
        break
    }
}

表達(dá)式模式:

//表達(dá)式模式
func test5() {
    let point = (1, 2)
    switch point {
    case (0, 0):
        print("(0, 0) is at the origin.")
        //這里就是表達(dá)式模式
    case (-2...2, -2...2):
        print("(\(point.0), \(point.1)) is near the origin.")
    default:
        print("The point is at (\(point.0), \(point.1)).")
    } // (1, 2) is near the  origin.
}

where:

//where模式
func test7() {
    var data = (10, "Jack")
    switch data {
    case let (age, _) where age > 10:
        print(data.1, "age>10")
    case let (age, _) where age > 0:
        print(data.1, "age>0")
    default: break
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末啄栓,一起剝皮案震驚了整個(gè)濱河市娄帖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌昙楚,老刑警劉巖近速,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡削葱,警方通過(guò)查閱死者的電腦和手機(jī)奖亚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)析砸,“玉大人昔字,你說(shuō)我怎么就攤上這事∈追保” “怎么了作郭?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)弦疮。 經(jīng)常有香客問(wèn)我夹攒,道長(zhǎng),這世上最難降的妖魔是什么胁塞? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任咏尝,我火速辦了婚禮,結(jié)果婚禮上闲先,老公的妹妹穿的比我還像新娘状土。我一直安慰自己无蜂,他們只是感情好伺糠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著斥季,像睡著了一般训桶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酣倾,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天舵揭,我揣著相機(jī)與錄音,去河邊找鬼躁锡。 笑死午绳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的映之。 我是一名探鬼主播拦焚,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼杠输!你這毒婦竟也來(lái)了赎败?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蠢甲,失蹤者是張志新(化名)和其女友劉穎僵刮,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡搞糕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年勇吊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窍仰。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡萧福,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辈赋,到底是詐尸還是另有隱情鲫忍,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布钥屈,位于F島的核電站悟民,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏篷就。R本人自食惡果不足惜射亏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望竭业。 院中可真熱鬧智润,春花似錦、人聲如沸未辆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)默终。三九已至,卻和暖如春序宦,著一層夾襖步出監(jiān)牢的瞬間拙友,已是汗流浹背为狸。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留遗契,地道東北人辐棒。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像牍蜂,于是被迫代替她去往敵國(guó)和親漾根。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容