2015-04-16 70 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語句正在使用它...代碼中的評論簡要地解釋了它的功能。 –

相關問題