为什么我不能在 switch 语句中使用元组常量作为大小写



我决定使用Swift case语句和元组。这看起来像是该语言的一个更酷的特点。

我决定玩月/日/年元组。令我惊讶的是,我不能在switch语句中使用常量元组值作为大小写。这里有一个例子(可以粘贴到操场上运行)

import UIKit
typealias mdyTuple = (month: Int, day: Int, year: Int)
let joesBirthday: mdyTuple = (month: 6, day: 7, year: 1978)
let someday: mdyTuple = (6, 7, 1978)
switch someday
{
//---------
//The line "case joesBirthday" won't compile.
//case joesBirthday:
//  println("Joe was born on this day"
//---------
case (joesBirthday.month, joesBirthday.day, joesBirthday.year):
println("Joe was born on this day")
case (joesBirthday.month, joesBirthday.day, let year):
println("Joe is (year-joesBirthday.year) today")
default:
println("Some other day")
}

注释掉的代码case joesBirthday:将不会编译(在Xcode 6.3中,如果这很重要的话)。下面的情况(我分别列出了joesBirthday元组的所有元素)既更难键入,也更难阅读,确实有效)

我的Playground在键入此内容时崩溃了Xcode,并在尝试重新启动Xcode时再次崩溃,所以我在报告错误代码时遇到了问题。

好吧,我终于让Xcode停止崩溃了(在连续4次崩溃之后。yyy!)错误是"二进制运算符~=不能应用于两个mdyTuple操作数。">

为什么要尝试使用~=操作数?像元组不相等吗?

是否有一些干净的替代语法可以让我在switch语句的情况下使用常量元组?

您可以为mydTuple类型实现~=运算符,如下所示:

func ~=(a: mdyTuple, b: mdyTuple) -> Bool {
return a.month ~= b.month && a.year ~= b.year && a.day ~= b.day
}

这对我在操场上很管用。。。现在,这个代码

switch someday {
case joesBirthday:
println("one")
default:
println("two")
}

打印"一"。

这是操作员的定义:

infix operator ~= {
associativity none
precedence 130
}

并且实现用于以下方面:

/// Returns `true` iff `pattern` contains `value`
func ~=<I : IntervalType>(pattern: I, value: I.Bound) -> Bool
func ~=<T>(lhs: _OptionalNilComparisonType, rhs: T?) -> Bool
func ~=<T : Equatable>(a: T, b: T) -> Bool
func ~=<I : ForwardIndexType where I : Comparable>(pattern: Range<I>, value: I) -> Bool

最新更新