2014-07-06 2 views
2

튜플에 대해 단항 연산자를 정의 할 수없는 것처럼 보입니다. 이 예제를 고려하십시오튜플에 대해 단항 연산자를 정의 할 수 없음

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

let t = (1, 2) 
-t 

그리고 오류가 발생합니다 : 는 대한 과부하를 찾을 수 없습니다 '-'지정된 인수를 받아 그. 이것은 예상되는 행동입니까?

이진 연산자가 정상적으로 작동한다는 점은 주목할 가치가 있습니다. 튜플에 대해 ==을 정의 할 수 있으며 예상대로 작동합니다.

답변

1

나는 이것 저것 놀고 있었고, 나에게는 버그처럼 보였다. 함수의 코드에는 아무런 문제가 없으며 접두사로 작동해야합니다. 버그 보고서 here을 제출할 수 있습니다. Apple 개발자 포럼에 게시하여 공식 소스에서 답장을받을 수도 있습니다. 그것은 (INT, INT)에 대한뿐만 아니라 SignedNumber 프로토콜을 따르는 2 요소 튜플뿐만 아니라 작동하므로

/// 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)") 

제네릭 글 :

+0

그래, 이미 몇 가지 신속한 버그 보고서를 제출했으며,이 보고서는 다른 보고서에 대한 좋은 후보자처럼 보입니다. 단지이를 분명히하고 싶었습니다. 개발자 포럼에서도 주제를 다뤘습니다.보고하기 전에 며칠 정도 기다려야합니다. – Nicky

+0

컴파일러는 Ints의 튜플에 대해 단항 연산자를 정의하고 Int에 대해 이진 연산자를 정의하는 것의 차이점을 어떻게 알 수 있습니까? – newacct

+0

글쎄, 왜 안되니? 구문이 다릅니다. 또한 typealias :'typealias IntPair = (Int, Int)'를 사용할 수도 있지만 여전히 예상대로 작동하지 않습니다. – Nicky

0

여기에 빠른 해결 방법입니다.

+0

개인적으로 문서화되지 않은 내부 용을 사용하지는 않겠지 만 이것은 꽤 멋지다. 나는 그들이 그것을 어떤 방식 으로든 대중에게 공개하기를 바랍니다. – Nicky

+0

@ 니키 (Nicky) 앞으로 어떤 점에서 분명하게 문서화 될 많은 자료가 문서화되지 않은 것 같습니다. 릴리스 1에 문서화되어 있지 않으면 걱정할 필요가 없습니다. – JeremyP