2014-07-06 19 views
2

看來您無法爲元組定義一元運算符。考慮下面這個例子:無法爲元組定義一元運算符

@prefix func - (tuple: (Int, Int)) -> (Int, Int) { 
    return (-tuple.0, -tuple.1) 
} 

let t = (1, 2) 
-t 

我得到一個錯誤:找不到一個重載「 - 」接受提供的參數。這是預期的行爲嗎?

值得注意的是,二元運算符工作正常,您可以爲元組定義==,並按預期工作。

回答

1

我一直在玩這個,它看起來像一個bug。函數中的代碼沒有問題,它應該作爲前綴工作。您可以提交錯誤報告here。您也可以嘗試在Apple Developer論壇發佈此信息,您可能會收到官方消息來源的回覆。

+0

是的,我已經提交了一些Swift錯誤報告,這似乎是另一個很好的候選人,只是想澄清它。我也在開發者論壇上發表了一個話題,在報告之前可能需要等待幾天才能獲得響應。 – Nicky

+0

編譯器如何區分定義一個Ints元組的一元運算符和爲Int定義一個二元運算符? – newacct

+0

那麼,爲什麼不呢?語法不同。你也可以使用typealias:'typealias IntPair =(Int,Int)',但它仍然無法按預期工作。 – Nicky

0

這裏是一個快速的解決方法:書面泛型

/// Should've called "Double" 
/// but it is already taken for double-precision number 
struct Duple<L,R> { 
    let l:L 
    let r:R 
    init(_ l:L, _ r:R) { 
     self.l = l 
     self.r = r 
    } 
    @conversion func __conversion()->(L,R) { 
     return (l, r) 
    } 
} 
@prefix func -<L:SignedNumber, R:SignedNumber> 
    (d:Duple<L,R>)->Duple<L,R> { 
    return Duple(-d.l, -d.r) 
} 

let pair = Duple(4, -2) 
let (left, right) = -pair 
println("\(left,right)") 

所以它的工作原理不僅對(INT,INT),而且這符合SignedNumber協議的任何2元件的元組。

+0

這很酷,儘管我個人不會使用無證內部。我希望他們以這種或那種方式公開。 – Nicky

+0

@Nicky在我看來,很多東西現在都沒有記錄,在將來某個時候顯然會記錄下來。除非在發行版1中沒有記錄,否則我不會擔心。 – JeremyP