pattern
栓票、pattern-matching
和value binding
雖然是我每天都會涉及的概念决左,可是今早我仔細想了一下,如何描述什么是pattern-matching
呢走贪?我發(fā)現(xiàn)這些內(nèi)容在我腦海里只是一個感覺佛猛,會立刻映射出一些代碼語句,但卻無法給出一個準確的定義坠狡,于是我立刻谷歌了一下继找,并做了一個小結。參考文章我放在了內(nèi)容的末尾逃沿。
什么是模式(pattern)
我們現(xiàn)在所說的模式可不是軟件工程中所指的設計模式婴渡,而是從數(shù)據(jù)結構的角度描述一個結構的組成。舉例子會更清晰一些凯亮,比方我們有一些數(shù)據(jù)边臼,4,true,"Hello,worder",[1,2,3]
,在缺乏一個結構之前假消,我們是難以利用計算機語言來描述和利用這些數(shù)據(jù)柠并,當我們給這些數(shù)據(jù)一個結構以后,例如swift的tuplevar tuple =(4,true,"Hello,worder",[1,2,3])
臼予,那們我們就可以利用結構方便的操作這些數(shù)據(jù)了鸣戴。tuple.0
參考文檔的定義:the pattern doesn’t represent just a value , instead it represents a range of values that match a given structure.
根據(jù)參考文檔的定義,我們舉一個tuple模式的例子粘拾,來進一步解釋這個定義窄锅。如果我們描述一個tuple結構(x,y)
,此時這個結構是不包括任何值的,這個結構的意義是在于說明:這個是一個包含兩個元素的tuple缰雇。通過描述tuple的結構而不是tuple中包含的值酬滤,那么這個結構就可以用來匹配任何包含兩個元素的tuple了,例如:(1,2),(true,false)
什么是模式匹配(pattern-matching)
其實搞定了pattern
,我們也就搞定了pattern-matching
,模式匹配也就是我們來檢驗變量是否匹配一種模式寓涨。例如(1,2)
就匹配(x,y)
但(1,2,3)
就不匹配盯串。
什么是值綁定(value binding)
value binding
是指我們通過模式匹配的方式,將獲得匹配的值賦給一個新的變量或常量戒良。值綁定適用于將組合值分解為一個個獨立的變量的場景体捏。
swift為我們提供了哪些模式
- The Identifier Pattern
let value = 1
switch value {
case 1:
print("Matched 1")
case 2:
print("Matched 2")
default:
print("Not matched")
}
- The Wildcard Pattern
var x = 3
for _ in 1...3 {
x *= 3
}
print(x)
- The Tuple Pattern
let myTuples = [(2, "Hello"), (3, "World"), (1, "Hello")]
for case (_, "Hello") in myTuples {
print("Matched")
}
- The Value-Binding Pattern
switch (40, 2) {
case let (x, y):
print("\(x) \(y)")
}
- The Enumeration Case Pattern
enum Orientation {
case FaceUp
case FaceDown(Int)
}
let myEnum = Orientation.FaceUp
if case Orientation.FaceUp = myEnum {
print("Face Up")
} else {
print("Face Down")
}
- The Optional Pattern
let myOptional : String? = "Hello"
switch myOptional {
case let .Some(value):
print(value)
case .None:
break
}
if case "Hello"? = myOptional {
print("Hello")
}
let optionalsArray : [Int?] = [1, 2, nil, 4, nil, 5]
for case let number? in optionalsArray {
print(number)
}
- The Type Casting Pattern
– is <type>
– <pattern> as <type>
- The Expression Pattern
let percentage = 87
var letterGrade = ""
switch percentage {
case 0..<60:
letterGrade = "E"
case 60..<70:
letterGrade = "D"
case 70..<80:
letterGrade = "C"
case 80..<90:
letterGrade = "B"
case 90...100:
letterGrade = "A"
default:
letterGrade = "Unknown"
}
print("Grade: \(letterGrade)")
參考內(nèi)容: