let str: Any? = "123"
switch str {
case _: print("无论如何都匹配的上")
default:break
}
if case nil = str {
print("如果str为nil 则匹配成功")
}
// 匹配optional, 注意: 这里是不为nil匹配成功, 为nil匹配失败, 可以单独使用nil来匹配空值
switch str {
case _?:
print("如果str不为nil 则匹配成功")
default:break
}
// 匹配 optional 并赋值, 如果 str 不为nil, a = str!
switch str {
case let a?:
print("如果str 不为nil 匹配成功 a 是 Any类型的")
default:break
}
// 不同于常规的 if let 这里的 a 仍然是可选值
if case let a = str {
print("把str匹配给a,必然匹配成功 ")
}
// 类型匹配
switch str {
case _ as Int: print("str 是 Int 类型的吗?")
default:break
}
// 匹配并转换 如果匹配成功 a 是String类型的
if case let a as String = str {
print("str 是string 类型的")
}
// 匹配值 因为swift不会隐式转换类型 所以想要匹配成功需要显示转换
switch str as? String {
case "str"?: print("值相同 匹配成功")
default:break
}
// is 只负责判断类型 在switch中我尝试接受is的返回值 但是失败了 可能编译器觉得: 这完全没必要 因为即便接收返回值, 这个返回值将永远是 true 因为false不会被匹配
switch str {
case is String:
print("is 匹配")
default:break
}
// 如果用if case 就能得到返回值 但是不会判断`s is Int`的结果
if case let a = str is Int {
print("即便是Int 也能匹配成功\(a)")
}
// 范围匹配
let index:Int = 10
switch index {
case 10:print("没什么好说的 正常操作")
default: break
}
switch index {
case 0..<100:print("范围匹配")
default:break
}
switch index {
case 0,10: print("多个值匹配")
default:break
}
更详细的解释: http://appventure.me/2015/08/20/swift-pattern-matching-in-detail/
网友评论