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

我决定使用Swift的case语句和元组。它看起来像是该语言的较酷功能之一。

我决定玩月/日/年元组。令我惊讶的是,我不能在switch语句中使用常量元组值作为案例。这是一个示例(可以粘贴到Playground中并运行)

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次之后。Yayyy!)。错误是“二进制运算符~=不能应用于两个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

以上是 为什么不能在switch语句中使用元组常量作为大小写 的全部内容, 来源链接: utcz.com/qa/397537.html

回到顶部