Swift中的常用匹配方式

在swift中,除了平时oc中所用的匹配时我们还可以这样使用匹配方式

let pt1 = (x:0.5, y:1)
        
        switch pt1 {
        case (0, 0):
            print("在原点")
        case (0, _):
            print("在x轴")
        case (_, 0):
            print("在y轴")
        case (-1...1, -1...1):
            print("值在-1到1之间")
        case (_, _):
            print("不在x轴或y轴,也不在-1~1之间")
        }

匹配时进行值绑定

        let pt1 = (x:0.5, y:0)
        
        switch pt1 {
        case (let x, 0):
            print("(\(x), 0) is on x axis")
        case (0, let y):
            print("(0, \(y)) is on y axis")
        default:
            break
        }     

自动提取optional的值进行判断:

        let skills: [String?] =
            ["Swift", nil, "PHP", "JavaScirpt", nil]
        
        for case let skill? in skills {
            print(skill) // Swift PHP JavaScript
        }

值类型判定:

        let someValues: [Any] = [1, 1.0, "One"]
        
        for value in someValues {
            switch value {
            case let v as Int:
                print("Integer \(v)")
            case let v as Double:
                print("Double \(v)")
            case let v as String:
                print("String \(v)")
            default:
                print("Invalid value")
            }
        }

除了使用具体的数值对循环或分支条件约束外,我们还可以使用where进行更复杂的约束, eg:

        for i in 1...10 where i % 2 == 0 {
            print(i)
        }

在实际工作中我们也可以将case、where等多个匹配语句结合来使我们的代码更为简单, eg:假设我们定义下面这样的enum表示手机电量

enum Power {
    case fullyCharged
    case normal(percentage: Double)
    case outOfPower
}

然后,定义一个变量battery表示手机电池:

let battery = Power.normal(percentage: 0.1)

这样,我们就可以在绑定.normal associated value的同时,使用where进一步约束它的关联值了:

switch battery {
case .normal(let percentage) where percentage <= 0.1:
    print("Almost out of power") 
case .normal(let percentage) where percentage >= 0.8:
    print("Almost fully charged")
default:
    print("Normal battery status")
}

通过“,”进行多情况判断, eg:

        let pt1 = (x:0, y:1)
        
        switch pt1 {
        case (0, 0):
            print("在原点")
        case (0, _),(_, 0):
            print("在数轴上")
        case (_, _):
            print("不在x轴或y轴,也不在-1~1之间")
        }

同上面的一样,多值判断我们还可以这么使用,可以大大减少代码量, eg:

        let username = "11@boxue.io"
        let password = 11111111

        if case ("11@boxue.io", 11111111) = (username, password) {
            print("correct")
        }

相对于oc中的多个值分别判断还是方便、简洁了一些的

转载于:https://www.cnblogs.com/GoodmorningMr/p/9628560.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值