模式匹配第三弹: 自定义的模式匹配和语法糖
在模式匹配系列文章的第一弹和第二弹中,我们已经看到关于 switch 搭配很多类型的用法,包括元组( Switch 和模式匹配操作符如果你在 答案非常简单:Swift 使用了 func ~=<I : ForwardIndexType where I : Comparable>(pattern: Range<I>,value: I) -> Bool 事实上,如果你写 这就意味着你可以为自己的类型定义相同的操作符 让你的自定义类型响应模式匹配我们构造一个自定义的结构体: struct Affine { var a: Int var b: Int } func ~= (lhs: Affine,rhs: Int) -> Bool { return rhs % lhs.a == lhs.b } switch 5 { case Affine(a: 2,b: 0): print("Even number") case Affine(a: 3,b: 1): print("3x+1") case Affine(a: 3,b: 2): print("3x+2") default: print("Other") } 最终打印的结果是 值得注意的一点是:在使用自定义类型时,Swift 不知道 switch 是否穷尽了所有可能。例如,即使我们添加了 此外需要注意,不要搞混了参数的顺序: ~= 的一些其他用途
例如,我们可以在第二弹中登场的 func ~= (lhs: Range<Int>,rhs: Book) -> Bool { return lhs ~= rhs.year } 现在测试一下: let aBook = Book(title: "20,000 leagues under the sea",author: "Jules Vernes",year: 1870) switch aBook { case 1800..<1900: print("19th century book") case 1900..<2000: print("20th century book") default: print("Other century") } 当然我不鼓励这样使用,将 Book 直接与一段整数范围比较并不能很清晰地展现我们的意图:『其实是想与 book 的出版年份进行比较』。更好的方式是在 switch 中直接传入 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |