"프로토콜…은 자체 또는 관련 유형 요구 사항이 있기 때문에 일반 제약으로 만 사용할 수 있습니다."는 무엇을 의미합니까?


123

Swift에서 사용자 정의 프로토콜을 기반으로 하는 Dictionary (실제로 HashSet ) 를 만들려고 하는데 제목에 오류가 있습니다.

프로토콜 'myProtocol'은 자체 또는 관련 유형 요구 사항이 있기 때문에 일반 제약 조건으로 만 사용할 수 있습니다.

머리도 꼬리도 만들 수 없습니다.

protocol Observing: Hashable { }

var observers = HashSet<Observing>()


@jtbandes 중복이 아닙니다. 오류 메시지가 실제로 무엇을 의미하는지 묻습니다. "자체 또는 관련 유형 요구 사항"이란 무엇입니까?
devios1 2014-07-24

답변:


90

프로토콜 Observing은 프로토콜 Hashable에서 상속되며 차례로 프로토콜에서 상속됩니다 Equatable. 프로토콜 Equatable에는 다음 요구 사항이 있습니다.

func ==(lhs: Self, rhs: Self) -> Bool

그리고 Self그 안에 어딘가 를 포함하는 프로토콜 은 유형 제약을 제외하고는 어디에도 사용할 수 없습니다.

여기에 비슷한 질문입니다.


7
... 컴파일러가 양쪽 에서 동일한 유형 인지 확인해야 하지만 프로토콜은 계약을 충족시키는 것만 보장하기 때문입니다. 내가 참조. 그래도 해시 코드를 생성하는 데 꼭 필요한 것은 아니기 때문에 Equatable반드시 암시해서는 안되는 것 같습니다 Equatable.
devios1 2014-07-25

4
오, 기다리지 마십시오 Dictionary. 주어진 객체가 실제로 올바른 키인지 알 수 있어야하기 때문입니다. 두 개의 다른 객체가 동일한 해시 코드를 생성 할 수 있기 때문입니다. 음, 약간 까다 롭습니다. 따라서 여기서 문제는 실제로 Equatable.
devios1 2014-07-25

4
제목 알렉시스 갤러거에 의해 위대한 프리젠 테이션에 0시 56분에서 봐 : 관련 유형과 프로토콜 그리고 그들은 그런 식으로 (아마도) 얻었는지 youtu.be/XWoNjiSPqI8
finneycanhelp을

@finneycanhelp 감사합니다 👍👍. 멋진 동영상!
devios1 2016 년

11

이를 해결하기 위해 제네릭을 사용할 수 있습니다. 이 예를 고려하십시오.

class GenericClass<T: Observing> {
   var observers = HashSet<T>()
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.