2016-11-22 2 views
2

나는 이상한 문제에 직면 해있다. 나는 다음과 같이 말하고있다. 나는 하나의 제네릭 타입을 또 다른 제네릭 타입으로 제약하고 싶다.스위프트 3의 제네릭의 제네릭

설명해 드리죠, 나는 간단한 제네릭 형식이 있습니다

class Simple<T : Equatable> { ... } 

을 그리고 또 다른 제네릭 형식 제약를 원하는 간단한 (일반) 입력하지 물론

class Complex<U : Simple> { ... } // WRONG! 

을 컴파일도이 없습니다 :

class Complex<U : Simple<T : Equatable>> { ... } // WRONG! 

도 :

내가 찾은
class Complex<U : Simple<T>> where T : Equatable { ... } // WRONG! 

유일한 방법은 다음과 같습니다

: 나는 그런 일이있을 경우

let x = Complex<Date, Simple<Date>>() 

최악의 상상 :

class Complex<T : Equatable, U : Simple<T>> { ... } 

그래서 나는 각 instanciation에 T를 반복해야합니다

class SimpleThing : Simple<Thing> { ... } 
let y = Complex<Thing, SimpleThing>() 

어떻게하면 Complex을 신고 할 수 있습니까? 이 방법으로 보내시겠습니까? :

let x = Complex<Simple<Date>>() 
let y = Complex<SimpleThing>() 

스위프트 3에서만 가능합니까?

미리 감사드립니다.

답변

1

내가 올바르게하고 싶은 것을 이해하고 있다면 관련 유형의 프로토콜을 사용하여이를 수행 할 수 있습니다. 당신은 당신의 Simple 클래스를 그것에 순응하게 만들 수 있고 Complex의 type 매개 변수를 그것의 순응 형으로 제한 할 수 있고, 마지막으로 연관된 형에 자격을 배치 할 수 있습니다. 다음과 같아야합니다.

protocol SimpleType { 
    associatedtype Assoc 
} 

class Simple<T: Equatable>: SimpleType { 
    typealias Assoc = T 
} 

class Complex<U: SimpleType> where U.Assoc: Equatable { 
    init() { 

    } 
} 

let c = Complex<Simple<Date>>() 
+0

겉으로보기에는 쉬운 문제에 대한 약간의 복잡한 해결책입니다. 어쨌든이 문제를 그런 식으로 보는 것이 매우 유용합니다. – Zaphod

관련 문제