2017-05-07 7 views
0

부속 형식을 프로토콜로 제한하는 방법은 무엇입니까?부속 형식을 프로토콜로 제한하는 방법

public protocol TestProtocol { 
    associatedtype TestType 
} 

public class TestClass<T : NSCoding> : TestProtocol { 

    public typealias TestType = T 

    public func get<T>(_ identifier: String) throws -> T? { 
     return "Test" as? T 
    } 
} 

이제 모든 것이 괜찮 :

나는 다음과 같은 프로토콜을 구현하는 클래스가 있다고 할 수 있습니다. func get은 컴파일러에서 필자의 제휴 유형이이 경우 프로토콜임을 알고 있기 때문에 컴파일됩니다.

문제는이 사용 사례로 시작는 TestType이 경우에 ProtocolType을 경우 컴파일러가 알 수 없기 때문에이 컴파일되지 않습니다

public protocol TestProtocol { 
    associatedtype TestType 

    func get<T>(_ identifier: String) throws -> T? where T : TestType 
} 

public class TestClass<T : NSCoding> : TestProtocol { 

    public typealias TestType = T 

    public func get<T>(_ identifier: String) throws -> T? { 
     return "Test" as? T 
    } 
} 

.

(는 말한다 : " 'T'가 아닌 프로토콜 유형 '는 TestType'로 제한 입력") 내가 프로토콜 종류가 될 프로토콜에 accociated 유형 '는 TestType'를 시행 할 수있는 방법

?

편집 : 내 첫 번째 예는 내가 무엇을 달성하고자하는 더 나은 정의를 오해의 소지가 조금이 (가)

public protocol TestProtocol { 
    associatedtype TestType 

    func get<T>(_ identifier: String) throws -> U? where U : TestType 
} 

public class TestClass<T : NSCoding> : TestProtocol { 

    public typealias TestType = T 

    public func get<U>(_ identifier: String) throws -> U? where U : T{ 
     return "Test" as? U 
    } 
} 

내가 '수'의 반환 형식 유형 U의 수 및 구현하려면 다음입니다 프로토콜 T (내 영속성 저장소에서 데이터를 검색하는 데 사용하고 싶습니다.)

이 표기법은 T가 프로토콜 유형이므로 (컴파일러 오류가 발생 함) 문제가되지 않습니다. 어떻게 시행 할 수 있습니까?

두 번째 편집 :

더 이상 내가 문제를보고, 더 내가 스위프트 - 제안 SE-0142이 문제 (그리고 빠른 4 기능)의 해결책이 SHURE입니다. 당신이 필요한 동작을 달성하는 방법을 다른 아이디어가 있다면 그러나 단지 알려

https://github.com/apple/swift-evolution/blob/master/proposals/0142-associated-types-constraints.md

, sbarow으로)

+0

왜 그냥'FUNC를하지 않는다 프로토콜에서 (_ identifier : String) throws -> TestType?'을 얻으시겠습니까? 클래스 정의에서'TestType'을'T'로 설정하면 프로토콜 정의에서'T : TestType'을 할 필요가 없습니다. – sbarow

+0

네, 맞습니다. 함수가 T를 포함해서는 안됩니다 ... 나는 첫 번째 게시물을 수정합니다 ... –

+0

그냥 초기 게시물에 봐. –

답변

0

제안 :

public protocol TestProtocol { 

    associatedtype TestType:Protocol 

    func get<TestType>(_ identifier: String) throws -> TestType? 
} 
+0

네, 죄송합니다. 이것은 나쁜 예였습니다. get의 리턴 타입은 TestType 프로토콜을 구현하는 다른 타입이어야합니다. –