2017-03-11 11 views
1

ジェネリック型を何とかジェネリック型にすることはできますか? 私はいくつかの関数を持っていますが、それはパラメータ型Uを持っています。どうすればいいのですか?Generic of Generics?クラスA <T<U>>?

コード:

class TableViewViewModel<T<U>> { 
    typealias SectionDataType = T 
    typealias RowDataType = U 

    var sections = [SectionDataType<RowDataType>]() 
} 
+0

私もそのことについて考えていたが、それは単に醜いで、エラーが発生しやすいです。例えば。 '' ConcreteViewModel

、モデル> ''。それはちょうど醜いです。そして私は、 '' ConcreteViewModel 、U>と '' TとU''が同じでない、つまり私が望んでいないものを許可していると話していません。 – denis631

+0

''どこで「句? – denis631

+1

単一の未知のジェネリックプレースホルダ( 'T ')がある未知のタイプはどのように使われますか?私はあなたには、一般的なプレースホルダーが1つのタイプのみで共通のロジックをいくつか持っているかどうか疑問に思っています。ほぼ確実にプロトコルを探しています(しかし、達成しようとしていることの具体的な例は見当たりませんが、確かに言うのは難しい)。たとえば – Hamish

答えて

2

が関連付けられているタイプを必要とするプロトコルSectionDataTypeを宣言してください。これは、適合するタイプ(例えばSectionのような)がタイプアリアスを実装しなければならないことを意味します。次に、TableViewViewModelには、そのタイプアリアスでUと呼んでいるタイプにアクセスできます。

protocol SectionDataType { 
    associatedtype RowDataType 
} 

struct Section<U>: SectionDataType { 
    typealias RowDataType = U 
} 

class TableViewViewModel<T: SectionDataType> { 
    typealias RowDataType = T.RowDataType 

    var sections = [T]() 
} 
+1

本当に滑らかです。ありがとうございました! – denis631

2

一般的なことは、タイプ(山括弧で何をしているか)を宣言することです。その後は、通常通りの構文です。私はあなたがしたいことを正確には分からないので、私は単に例を投稿します。次の関数は、3つのジェネリック型(T、U、Z)を宣言し、型Uとパラメータとして関数を取ります。関数自体は型Uの値を取り、型Tの値を返します。 Z.(これは、あるとしてかなり役に立たないFUNCであるが、複雑な形でジェネリックを使用する方法の一例):

​​
関連する問題