2015-04-16 41 views
4

我决定玩Swift case语句和元组。它看起来像是该语言的一个较酷的功能。我决定玩月/日/年元组。令我惊讶的是,我不能在switch语句中使用常量元组值。下面是一个例子(可以被粘贴到一个游乐场和运行)为什么我不能在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元组的所有元素),这是难以打字,更难以阅读,确实有效)

我的游乐场在输入时崩溃了Xcode,并重新崩溃重新尝试重新启动Xcode,所以我无法报告错误代码。

好的,我终于得到了Xcode停止崩溃(在连续4次崩溃后Yayyy!)错误是“二进制运算符~=不能应用于两个mdyTuple操作数”。

为什么它试图使用~=操作数?是不是像元组equatable?

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

+0

如果您在使用开关元组指标是什么? – msmq

+0

like'case(joesBirthday.0,joesBirthday.1,joesBirthday.2):'?当然,这是有效的,但这并不比命名的元素语法更好。我想直接列出一个元组常量作为一个case值。 –

回答

4

您可以实现的~=运营商为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 
+0

这确实有用。凉。 (投票)我对〜=运算符的作用还有些含义,以及它如何与case语句一起工作。 –

+1

这是对〜=运算符的很好的解释: http://austinzheng.com/2014/12/17/custom-pattern-matching/ –

+0

它是“模式匹配运算符”,我假设switch语句正在使用它...代码中的评论简要地解释了它的功能。 –

相关问题