import UIKit
import Foundation
/Swift 模式匹配**/
enum Weather {
case rain, snow, wind, sunny
}
let todayWeather = Weather.rain
switch todayWeather {
case .rain, .snow:
print("")
case .wind:
print("")
case .sunny:
print("")
}
enum Direction {
case east(angle: Int, length: Int), west(angle: Int, length: Int), south(angle: Int, length: Int), north(angle: Int, length: Int)
}
let curDirect = Direction.east(angle: 30, length: 1000)
switch curDirect {
case .east(let angle, _):
if angle > 10 {
}
case .west(let angle, _) where angle > 60:
print("")
case .south(let angle, _):
if angle > 10 {
}
case .north(let angle, _):
if angle > 10 {
}
default:
break
}
/原生类的匹配***/
let name = “Spiderman”
switch name {
case “Ironman”:
print(“钢铁侠”)
case “Spiderman”:
print(“蜘蛛侠”)
default:
print(“不认识”)
}
let point = (x: 10, y: 0)
switch point {
case (0, 0):
print(“原点”)
case (0, _):
print(“Y轴p偏移”)
case (let x, 0):
print(“X轴偏移:(x)”)
case (let x, let y) where x == y:
print(“X = Y”)
default:
break
}
let index = 100
switch index {
case 0…20:
print(“20以内”)
case 21:
print(“正好21”)
case 30…<100:
print(“30到100之间,不包括100”)
default:
print(“其它范围”)
}
/类型匹配***/
protocol Animal {
var name: String { get }
}
struct Dog: Animal {
var name: String {
return “dog”
}
var runSpeed: Int
}
struct Bird: Animal {
var name: String {
return “bird”
}
var flightHeight: Int
}
struct Fish: Animal {
var name: String {
return “fish”
}
var depth: Int
}
let animals = [Dog.init(runSpeed: 55), Bird.init(flightHeight: 2000), Fish.init(depth: 100)] as [Any]
for animal in animals {
switch animal {
case let dog as Dog:
print("(dog.name) can run (dog.runSpeed)")
case let fish as Fish:
print("(fish.name) can dive depth (fish.depth)")
case is Bird:
print(“bird can fly!”)
default:
print(“unknown animal!”)
}
}
/自定义类型匹配***/
struct BodyFatRate {
var weight: Float
var fat: Float
}
let player = BodyFatRate(weight: 180, fat: 30)
/// 重载的~=操作符,简单的实现了体脂率BodyFatRate和range的匹配。该方法一共接收两个参数并返回一个bool类型的匹配结果。第一个参数lhs为case值,是体脂率的范围。第二个参数为switch传入的值player
func ~=(lhs: Range, rhs: BodyFatRate) -> Bool {
return lhs.contains(rhs.fat / rhs.weight)
}
switch player {
case 0.0…<0.15:
print(“难以置信”)
case 0.15…<0.2:
print(“健康”)
case 0.21…<0.99:
print(“该减肥了”)
default:
break
}
/高阶语法糖***/
if case let .rain(level) = todayWeather {
print(“雨的等级:(level)”)
}
if case let .rain(level) = todayWeather, level < 5 {
print(“下小雨”)
}
for case let .rain(level) in weatherInWeek where level > 5 {
print(“下大雨”)
}