美文网首页
Swift重载运算符在switch-case中的模式匹配

Swift重载运算符在switch-case中的模式匹配

作者: jezong | 来源:发表于2016-09-27 17:27 被阅读0次

神奇的Swift

swift的switch-case语句可以非常灵活的进行匹配,每个case段可以对应一个或多个匹配项,这比其他语言都要好用。比如苹果官方文档中列举了一个例子

for thing in things {
    switch thing {
    case 0 as Int:
        print("zero as an Int")
    case 0 as Double:
        print("zero as a Double")
    case let someInt as Int:
        print("an integer value of \(someInt)")
    case let someDouble as Double where someDouble > 0:
        print("a positive double value of \(someDouble)")
    case is Double:
        print("some other double value that I don't want to print")
    case let someString as String:
        print("a string value of \"\(someString)\"")
    case let (x, y) as (Double, Double):
        print("an (x, y) point at \(x), \(y)")
    case let movie as Movie:
        print("a movie called '\(movie.name)', dir. \(movie.director)")
    case let stringConverter as String -> String:
        print(stringConverter("Michael"))
    default:
        print("something else")
    }
}
 
// zero as an Int
// zero as a Double
// an integer value of 42
// a positive double value of 3.14159
// a string value of "hello"
// an (x, y) point at 3.0, 5.0
// a movie called 'Ghostbusters', dir. Ivan Reitman
// Hello, Michael

一个例子

默认情况下,case后面是不支持Array数组的,如果你使用数组当作case的匹配条件的话,编译就会失败,比如下面这种情况:

let number = 0
let luckyNums = [8, 88, 888]
switch number {
case 0:
    print("= 0.")
case luckyNums: //此处报错
    print("It's lucky number.")
default:
    print("Other.")
}

编译器给你弹了个红红的感叹号,告诉你:Expression pattern of type '[Int]' cannot match values of type 'Int'
意思是,Int值不能与[Int]值进行匹配。

我们都知道计算机是无法对比两个不同类型的值的,很明显,Int是整型,[Int]是整型数组。swift是一门类型安全的语言,即使是UInt16UInt32也不能直接比较,也要转换成UInt16vsUInt16 或者 UInt32vsUInt32才能进行比较,更何况是将值类型和数组类型进行对比。

难道没有办法了吗?

办法是有的!switch-case结构将传入的值与case分支进行比较,编译器会将它们进行模式匹配,也就是~=(不是==)运算符,如果编译器找不到这两种类型的模式匹配规则(方法),那么就会报错,因此我们只需重载~=运算符就可以实现匹配数组了。

添加一个全局的重载方法:

func ~=<T: Equatable>(lhs: [T], rhs: T) -> Bool {
    for tmp in lhs where rhs == tmp{
        return true
    }
    return false
}

前面的例子中,我们可以看到红色感叹号消失了。number重新赋值:

let number = 8  //or 88, 888

Playground输出:

It's lucky number.

结束

通过重载~=运算符,可以看出swift的代码其实是非常灵活的,工程中可以通过重载运算符、extension、万能的enum等等高级用法来减少代码量,提高代码的可阅读行。

相关文章

  • Swift重载运算符在switch-case中的模式匹配

    神奇的Swift swift的switch-case语句可以非常灵活的进行匹配,每个case段可以对应一个或多个匹...

  • swift 应用

    //swift 暴露 objc 调用 //swift 调用 objc //自定义表达式模式 (重载运算符 ~=,自...

  • swift重载或自定义操作符

    重载运算符 在Swift中,类和结构体是可以提供现有运算符的自定义实现,也就是重载现有运算符。三元运算符(a?b:...

  • Swift - 运算符重载

    一、定义 在Swift的官方文档中运算符重载叫做运算符函数(Operator Functions)。简单来讲主要实...

  • 获取当前的iOS设备型号

    Tips: 1.OC中switch-case 无法匹配字符串,故使用if,swift 中建议使用switch-ca...

  • swift中的运算符重载

    在Swift的官方文档中运算符重载叫做运算符函数(Operator Functions),顾名思义就是对已经有的运...

  • ios 经典面试案例 (七)

    Swift有哪些模式匹配? 模式匹配总结: 1.通配符模式(Wildcard Pattern)如果你在 Swift...

  • Swift 模式匹配总结

    Swift 模式匹配总结 基本用法 对枚举的匹配: 在swift中 不需要使用break跳出当前匹配,默认只执行一...

  • 每天学一点Swift---- 运算符函数

    一.运算符重载 1. Swift的运算符提供了良好的可扩展性,Swift不仅允许开发者重新定义已有的运算符(运算符...

  • Swift-模式匹配

    模式就是匹配的规则,下面介绍Swift中的模式。 1. 通配符模式 _匹配任何值,_?匹配非nil值。 2. 标识...

网友评论

      本文标题:Swift重载运算符在switch-case中的模式匹配

      本文链接:https://www.haomeiwen.com/subject/vqzcyttx.html