2016-11-22 5 views
2

私は奇妙な問題に直面しています。ここには次のようなものがあります。Swiftのジェネリックスのジェネリック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! 

私が見つけた唯一の方法は次のとおりです。

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

だから私は、各インスタンス化にTを繰り返す必要があります。

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

最悪、私はそのようなことがあれば想像:

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

私はComplexをどのように宣言できますか?このようにしますか?:

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

Swift 3でのみ可能ですか?

ありがとうございます。

答えて

1

あなたが正しくやりたいことを理解しているなら、これは関連するタイプのプロトコルで実現できます。 Simpleクラスをそれに準拠させ、Complexの型パラメータをその適合する型に制約し、最後に関連する型に資格を配置することができます。

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

関連する問題