2016-11-02 4 views
1

저는 Xcode 7.3과 Swift 2.3을 사용하고 있습니다. 변수가있는 관련 유형의 프로토콜을 사용하는 데 어려움이 있습니다. 예 봐 : 어떤 이유관련 유형이있는 프로토콜의 일반 변수입니다. 곤충?

protocol SomeProtocol {} 
class SomeProtocolImpl: SomeProtocol {} 

protocol ProtocolWithAssociatedType { 
    associatedtype T: SomeProtocol 

    var variable: T { get } 
} 

class TestClass: ProtocolWithAssociatedType { 

    var variable: SomeProtocol = SomeProtocolImpl() 

} 

, 컴파일러는 오류를 보여줍니다 error image 어떻게 가능? 내가 뭔가 잘못하고 있는거야? 그게 버그 야? 알려진 것? 나는 무엇을 시도했다

: 그 연결 유형에 대한

정의 typealias :

class TestClass: ProtocolWithAssociatedType { 
    typealias O = SomeProtocol 
    var variable: SomeProtocol = SomeProtocolImpl() 
} 

싫다. 대신

사용되는 방법 : second error image

이 오류를 방지하는 방법은 관련 유형과 변수와 프로토콜을 만들어야합니다

protocol SomeProtocol {} 
class SomeProtocolImpl: SomeProtocol {} 

protocol ProtocolWithAssociatedType { 
    associatedtype T: SomeProtocol 

    func someMethod() -> T 
} 

class TestClass: ProtocolWithAssociatedType { 
    typealias T = SomeProtocol 

    func someMethod() -> SomeProtocol { 
     return SomeProtocolImpl() 
    } 

} 

그냥 다른 오류가있어?

+0

는 @Hamish 그래, 참으로, 당신은 바로 –

답변

1

컴파일러에는 SomeProtocol에 맞는 T에 대한 특정 유형이 필요합니다. 이 줄은 올바른 보이지만

var variable: SomeProtocol 

컴파일러로 실행되는 문제는 프로토콜의, SomeProtocol이 유형이 아닌 것입니다.

가장 쉬운 해결책은

var variable: SomeProtocolImpl = SomeProtocolImpl() 

를 사용하거나 그 자체를 알아낼 수 있도록 컴파일러에게 유형을 말한다.

var variable = SomeProtocolImpl() 
+0

귀하의 설명이 맞다,하지만 컴파일러는 SomeProtocol'을 준수 T에 대한 특정 유형을 필요로하는 이유'나는 아직도 이해할 수 없습니다. 어떤 이유가 있을까요? 임시 컴파일 제한 사항입니까? –

+0

그리고 불행히도 당신의 대답은 내 문제를 해결하지 못합니다 - 나는 아직도이 변수를 인 캡슐 레이션을 유지하고 구체적인 구현에 의존하지 않도록 프로토콜로 선언해야합니다. –

+0

그런 다음 관련 유형을 사용하지 않도록 프로토콜을 변경해야합니다. 'var 변수 : SomeProtocol {get}' –

관련 문제