// 自定义表达式模式
struct Student {
var score = 0, name = ""
/// pattern: case 后面内容
/// value: switch 后面内容
static func ~=(pattern: Int, value: Student) -> Bool {
return value.score >= pattern
}
static func ~=(pattern: Range<Int>, value: Student) -> Bool {
return pattern.contains(value.score)
}
static func ~=(pattern: ClosedRange<Int>, value: Student) -> Bool {
return pattern.contains(value.score)
}
}
var stu = Student(score: 75, name: "Tom")
switch stu {
case 100:
print(">=100")
case 90:
print(">=90")
case 80..<90:
print("[80, 90]")
case 60...79:
print("[60, 79]")
case 0:
print(">=0")
default:
break
}
extension String {
static func ~=(pattern: (String) -> String, value: String) -> Bool {
return pattern(value)
}
}
func hasPrefix(_ prefix: String) -> ((String) -> Bool) {
return { $0.hasPrefix(prefix) }
}
func hasSuffix(_ suffix: String) -> ((String) -> Bool) {
return { $0.hasSuffix(suffix) }
}
var fn = hasPrefix("123")
print(fn("123456"))
var str = "123456"
switch str {
case hasPrefix("123"), hasSuffix("456"):
print("123开头")
print("456结尾")
default:
break
}
func isEven(_ i: Int) -> Bool {
return i % 2 == 0
}
func isOdd(_ i: Int) -> Bool {
return i % 2 != 0
}
extension Int {
static func ~=(pattern: (Int) -> Bool, value: Int) -> Bool {
return pattern(value)
}
}
var age = 9
switch age {
case isEven: //函数匹配,函数类型
print(age,"是个偶数")
case isOdd:
print(age,"是个奇数")
default:
break
}
–EOF–