그래서 SpriteKit을 사용할 때 CGPoint
, CGVector
및 CGSize
을 제대로 처리하려고합니다. 이들 모두는 수직 및 수평 구성 요소 (벡터)가있는 구조체입니다. 나는 3 구조체를 확장 물론 VectorType
'! ='연산자를 모호하게 사용합니다.
protocol VectorType {
init(x: CGFloat, y: CGFloat)
var x: CGFloat { get set }
var y: CGFloat { get set }
}
이 프로토콜을 준수하고 각 구조체 즉의 수평 및 수직 성분 x
반환 CGVector
에 대한 dx
에 x
및 y
를 연결하는 (에 대한 같은 : 그래서 프로토콜을 만들어 설정), x
은 CGSize
의 경우 width
을 반환하고 CGPoint
의 경우 해당 값을 그대로 사용하므로 확장명을 비워 둡니다.
이제 "주"연산자 (+ - * /
...)가 오버로드되었으므로 쉽게 캐스팅하거나 새 객체를 만들지 않고도 여러 유형의 구조체와 관련된 작업을 수행 할 수 있습니다. 그러나 여기에서 중요한 것은 또한 오버로드 된 것입니다. 이 같은 등가 운영자 :
//Compiler requires me to use generics for some reason
func == <T: VectorType, U: VectorType> (lhs: T, rhs: U) -> Bool {
return (lhs.x == rhs.x) && (lhs.y == rhs.y)
}
func != <T: VectorType, U: VectorType> (lhs: T, rhs: U) -> Bool {
return !(lhs == rhs)
}
,이 코드의 모든 것이 !=
운영자를 제외하고 괜찮 테스트 할 때. 이러한 연산자를 테스트하기 위해 크기, 벡터 크기 및 크기를 점과 비교하여 각 유형에 대해 비교합니다. ==
을 사용할 때 아무런 문제가 없습니다. 내가 !=
를 사용할 때
하지만, 문제가 있습니다. 이 같은 Ambiguous use of operator '!='
있습니다 :
이 어디에서 오는 나는 완전히 얻을 : CGVector to CGVector
, CGPoint to CGPoint
및 CGSize to CGSize
이미 존재 비교 ==
및 !=
운영자 오버로드. 이것들은 다음과 같이 선언됩니다.
@warn_unused_result func ==(lhs: CGSize, rhs: CGSize) -> Bool
모든 종류의 과부하가 있습니다. 따라서 모호성이 어디서 발생하는지 알아보고, 같은 유형을 비교할 때 어떤 연산자를 사용할 지 알지 못합니다. 그러나 우리가 기본적으로 동일한 상황을 가지고 있다면 testEqual()
에 ==
연산자와 같은 문제가없는 이유를 이해할 수 없습니다.
필자는 컴파일러 버그 인 것 같지만 잘 모르겠다. 프로젝트 정리, Xcode 재시작 및 새 프로젝트 만들기를 시도했지만 여전히 작동하지 않는다. 또한 Found this candidate
을 선택하는 모호성을 유발하는 다른 선언을 보려고하면 아무 것도 표시되지 않습니다.
그래서 문제는 어떻게 작동시킬 수 있습니까? 또는 다른 작동 방식을 제안 할 수 있습니까? (다른 작동기를 만드는 것을 포함하지 않습니다)?
업데이트
내가 사용하고 실제로 ==
및 !=
구현이 실제로 다르게 선언 된 것을 발견했다.이것은 사용되는 ==
과부하가 AFAIK이 또한 내 선언과 충돌한다
@warn_unused_result func ==(lhs: CGSize, rhs: CGSize) -> Bool
을 선언하는 방법이지만, 분명히하지 않습니다.
여기에 다른 !=
오버로드 선언이 있습니다.
@warn_unused_result func !=<T : Equatable>(lhs: T, rhs: T) -> Bool
lhs
이후
rhs
및 동일한 형태를 가지며 VectorType 프로토콜에 따르는 세 종류 Equatable
이 과부하가 동작을위한 후보 부합.
CGVector
,
CGPoint
또는
CGSize
A에 대한 요구, 그리고 아마도 그 제네릭을 통해 우선합니다 때문에
==
사용됩니다 같아요. 두
==
운영자가 충돌하지 않는 이유를 알고 계신지 확실하지 않습니다.
'! ='정의를 덮어 쓰지 않으면 어떻게 될까요? 'not =='을 기본으로하는 기본 구현을 가지고 있습니다. – Alexander
BTW 자신의 유형에'CG' 접두어를 사용하지 마십시오. 그것은 CoreGraphics에 대해 통상적으로 예약되어 있습니다. – Alexander
글쎄요, 제가 할 수있을 것 같아요.하지만 기분이 좋지 않습니다. 나는 피하려고하는 것을 수동으로 비교할 필요가 있습니다.하지만 다른 해결책을 찾을 수 없다면 나는 갈거야. 그리고 네, 저는 CG 작품에 대해 생각하고 있었고, 저는 그것을 바꿀 것입니다. 작품 이름을 지었을 때 가장 먼저 생각한 것이 었습니다. – lsauceda