Swift5.x入門18--字面量颈抚,模式匹配嚼鹉,條件編譯

字面量

var age = 10
var isRed = false
var name = "liyanyan"
  • 其中10false匹舞,liyanyan是字面量线脚;

常見的字面量類型

  • public typealias Float32 = Float
  • public typealias Float64 = Double
  • public typealias IntegerLiteralType = Int
  • public typealias FloatLiteralType = Double
  • public typealias BooleanLiteralType = Bool
  • public typealias StringLiteralType = String
  • 在Swift中絕大部分自帶的類型,都支持直接通過字面量進行初始化晰绎,Bool括丁,Int,String尖昏,Double构资,Array蚯窥,Dictionary,Set巍沙,Optional荷鼠,F(xiàn)loat等

字面量協(xié)議

  • Swift中絕大部分自帶的類型,都支持直接通過字面量進行初始化矮嫉,原因在于它們遵守了字面量協(xié)議牍疏;
  • Bool:ExpressibleByBooleanLiteral
  • Int:ExpressibleByIntergerLiteral
  • Float鳞陨,Double:ExpressibleByFloatLiteral
  • Dictionary:ExpressibleByDictionaryLiteral
  • String:ExpressibleByStringLiteral
  • Array,Set:ExpressibleBySetLiteral
  • Optional:ExpressibleByNilLiteral

字面量協(xié)議的應(yīng)用

模式匹配

  • 模式:用于匹配的規(guī)則援岩,比如switch的case掏导,捕捉錯誤的catch等趟咆;
通配符模式
  • _ 匹配任何值梅屉;
  • _? 匹配非nil的值
enum Life {
    case human(name: String,age: Int?)
    case animal(name: String,age: Int?)
}

func check(_ life: Life) {
    switch life {
    case .human(let name, _):
        print("human",name)
    case .animal(let name, _?):
        print("animal",name)
    default:
        print("other")
    }
}
  • case .human(let name, _):表示life是human類型且name有值履植,age可以為任何值悄晃;
  • case .animal(let name, _?):表示life是animal類型且name有值,age不能為空庶近;

標(biāo)識符模式

  • 給對應(yīng)的變量眷蚓,常量名賦值沙热;
var age = 10
var isRed = false
var name = "liyanyan"

值綁定模式

let point = (3,2)
switch point {
case let (x,y):
    print("point",x,y)
}
  • 將3和2分別綁定到x,y投队;

元組模式

let points = [(0,0),(1,0),(2,0)]

for (x,_) in points {
    print(x)
}
let name: String? = "Li"
let age = 18
let info: Any = [1,2]

switch (name,age,info){
case (_?, _, _ as String):
    print("case")
default:
    print("default")
}

枚舉case模式

let age = 2

func test() {
    if age >= 0 && age <= 9 {
        print("[0,9]")
    }

    if case 0...9 = age {
        print("[0,9]")
    }
     
    guard case 0...9 = age else {
        return
    }
    print("[0,9]")
}
let ages: [Int?] = [2,3,nil,5]
for case nil in ages {
    print("有nil值")
    break
}
let points = [(1,0),(2,1),(3,0)]

for case let (x,0) in points {
    print(x)
}
可選模式
let age: Int? = 33

if case let x? = age{
    print(x)
}

if case .some(let x) = age {
    print(x)
}

let ages: [Int?] = [nil,2,3,4,nil]

for case let age? in ages {
    print(age)
}

for item in ages {
    if let age = item {
        print(age)
    }
}
 
func check(_ num: Int?) {
    switch num {
    case 2?: //首先不為空敷鸦,且數(shù)據(jù)為2
        print("2")
    case 4?:
        print("2")
    case _?:
        print("other")
    case _:
        print("nil")
    }
}
類型轉(zhuǎn)換模式
let num: Any = 6

func test() {
    switch num {
    case is Int:
        //num 依然是Any類型
        print("is Int",num)
    default:
        break
    }
}


func test1() {
    switch num {
    case let n as Int:
        //num 依然是Any類型
        //n 是Int
        print("as Int",n + 1)
    default:
        break
    }
}
表達式模式
let point = (1,2)

func test() {
    switch point {
    case (0,0):
        print("(0,0)")
    case (-2...2,-2...2):
        print("-2,-2")
    default:
        print("the point is x,y")
    }
}
自定義表達式模式
  • 可以通過重載運算符扒披,自定義表達式模式的匹配規(guī)則圃泡;
  • case底層調(diào)用的是~=運算符颇蜡,那么我們通過重載~=運算符,實現(xiàn)自定義表達式模式的匹配規(guī)則;
struct Student {
    var score = 0
    var name = ""
    //pattern:case后面的內(nèi)容
    //value:switch后面的內(nèi)容
    static func ~=(pattern: Int,value: Student) -> Bool {
        value.score >= pattern   
    }
    static func ~=(pattern: ClosedRange<Int>,value: Student) -> Bool {
        pattern.contains(value.score)
    }
}

func test() {
    var s = Student(score: 55, name: "Jack")

    switch s {
    case 100:
        print(">=100")
    case 90:
        print(">=90")
    case 80...89:
        print("[89]")
    case 60...79:
        print("[60,79]")
    default:
        print(">=0")
    }
}
  • 實現(xiàn)字符串匹配唁情;
extension String {
    static func ~=(pattern: (String) -> Bool,value: String) -> Bool {
        pattern(value)
    }
}

func hasPrefix(_ prefix: String) -> ((String) -> Bool) {
    {
        (str: String) -> Bool in
        return str.hasPrefix(prefix)
    }
}

func hasSuffix(_ suffix: String) -> ((String) -> Bool) {
    {
        (str: String) -> Bool in
        return str.hasSuffix(suffix)
    }
}

var str: String = "123456"
switch str {
case hasPrefix("123"):
    print("以123開頭")
case hasSuffix("456"):
    print("以456結(jié)尾")
default:
    break
}

where

  • 可以使用where為模式匹配增加匹配條件甸鸟;

條件編譯

//操作系統(tǒng)
#if os(macOS) || os(iOS)

//CPU架構(gòu)
#elseif arch(x86_64) || arch(arm64)

//swift版本
#elseif swift(<5) && swift(>=3)

//模擬器
#elseif targetEnvironment(simulator)

//可倒入某模塊
#elseif canImport(Foundation)

#else

#endif

日志打印

  • 實現(xiàn)在Debug模式在打印日志,在Release模式下不打印日志薪贫;
  • 新建log.swift文件刻恭,實現(xiàn)自定義log方法鳍贾,如下:
import Foundation

func log<T>(_ msg: T,file: NSString = #file,line: Int = #line,fn: String = #function) {
    #if DEBUG
    let prefix = "\(file.lastPathComponent)_\(line)_\(fn):"
    print(prefix,msg)
    #endif
}

系統(tǒng)版本檢測

if #available(iOS 10, macOS 10.12, *){
    //對于iOS平臺 只在iOS 10及以上版本執(zhí)行
    //對于macOS平臺 只在macOS 10.12及以上版本執(zhí)行
    //* 表示在其他所有平臺都執(zhí)行
    
}

API的可用性

//Person的使用條件
@available(iOS 12,macOS 10.15, *)
class Person {}

struct Student {
    //方法study_已經(jīng)改名為study
    @available(*,unavailable,renamed: "study")
    func study_() {}
    func study() {}
    
    //run方法在iOS11 macOS10.12版本已經(jīng)廢棄
    @available(iOS,deprecated: 11)
    @available(macOS,deprecated: 10.12)
    func run() {}
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末骑科,一起剝皮案震驚了整個濱河市咆爽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌斗埂,老刑警劉巖蜜笤,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件把兔,死亡現(xiàn)場離奇詭異,居然都是意外死亡围橡,警方通過查閱死者的電腦和手機缕贡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門晾咪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人塞赂,你說我怎么就攤上這事昼蛀≡泊妫” “怎么了沦辙?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵油讯,是天一觀的道長辟拷。 經(jīng)常有香客問我,道長诀紊,這世上最難降的妖魔是什么隅俘? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任为居,我火速辦了婚禮,結(jié)果婚禮上贰镣,老公的妹妹穿的比我還像新娘膳凝。我一直安慰自己,他們只是感情好上煤,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布劫狠。 她就那樣靜靜地躺著永部,像睡著了一般。 火紅的嫁衣襯著肌膚如雪苔埋。 梳的紋絲不亂的頭發(fā)上懦砂,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機與錄音,去河邊找鬼孕惜。 笑死,一個胖子當(dāng)著我的面吹牛晨炕,可吹牛的內(nèi)容都是我干的衫画。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瓮栗,長吁一口氣:“原來是場噩夢啊……” “哼削罩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起费奸,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎愿阐,沒想到半個月后微服,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡缨历,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年以蕴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辛孵。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡丛肮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出魄缚,到底是詐尸還是另有隱情宝与,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布冶匹,位于F島的核電站习劫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏徙硅。R本人自食惡果不足惜榜聂,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嗓蘑。 院中可真熱鬧须肆,春花似錦、人聲如沸桩皿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泄隔。三九已至拒贱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背逻澳。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工闸天, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人斜做。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓苞氮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瓤逼。 傳聞我的和親對象是個殘疾皇子笼吟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

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