看來您無法爲元組定義一元運算符。考慮下面這個例子:無法爲元組定義一元運算符
@prefix func - (tuple: (Int, Int)) -> (Int, Int) {
return (-tuple.0, -tuple.1)
}
let t = (1, 2)
-t
我得到一個錯誤:找不到一個重載「 - 」接受提供的參數。這是預期的行爲嗎?
值得注意的是,二元運算符工作正常,您可以爲元組定義==
,並按預期工作。
看來您無法爲元組定義一元運算符。考慮下面這個例子:無法爲元組定義一元運算符
@prefix func - (tuple: (Int, Int)) -> (Int, Int) {
return (-tuple.0, -tuple.1)
}
let t = (1, 2)
-t
我得到一個錯誤:找不到一個重載「 - 」接受提供的參數。這是預期的行爲嗎?
值得注意的是,二元運算符工作正常,您可以爲元組定義==
,並按預期工作。
我一直在玩這個,它看起來像一個bug。函數中的代碼沒有問題,它應該作爲前綴工作。您可以提交錯誤報告here。您也可以嘗試在Apple Developer論壇發佈此信息,您可能會收到官方消息來源的回覆。
這裏是一個快速的解決方法:書面泛型
/// 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元件的元組。
是的,我已經提交了一些Swift錯誤報告,這似乎是另一個很好的候選人,只是想澄清它。我也在開發者論壇上發表了一個話題,在報告之前可能需要等待幾天才能獲得響應。 – Nicky
編譯器如何區分定義一個Ints元組的一元運算符和爲Int定義一個二元運算符? – newacct
那麼,爲什麼不呢?語法不同。你也可以使用typealias:'typealias IntPair =(Int,Int)',但它仍然無法按預期工作。 – Nicky