2016-05-18 5 views
0

私は約8-9回繰り返されている関数を持っています。私は冗長性を減らそうとしています。spefic型を取り、配列を返す関数を作成することは可能です送信されるjsonオブジェクトを使用して初期化された型の関数の引数として特定の型だけを渡す

現在の機能

static func initArray(json: JSON)-> [Event]{ 
     var array = [Event]() 
     json.forEach(){ 
      array.append(Event.init(json: $0.1)) 
     } 
     return array 
    } 

所望の機能

static func initArray<T> (type: T, json: JSON)-> [T]{ 
    var array = [T]() 
    //I get stuck here im not too sure how to initlize the type 
    //Thats why im wondering if it's possible to pass speific types 
    //to the function 
    return array 
} 

答えて

1

あなたは初期化子がそれに利用できるものは何でもして、ちょうど任意の既知のクラスのインスタンスのようにTのインスタンスを初期化します。あなたの選択肢が何であるかを知るには、一般的に何らかの形で制約Tが必要です。私がこれについて一般的に行っているのは、関数に渡すことに関心のあるすべての型を採用することをと定義することです。あなたの場合は、具体的なイニシャライザをに入れます。そして、そのタイプのものであるとTを制約:ジェネリック型を制約することは、私が示されてきたものよりも複雑になる可能性が

protocol SomeProtocol { 
    init(json: JSON) 
} 

class someClass { 
    static func initArray<T:SomeProtocol>(type: T, json: JSON) -> [T] { 
     // Create your objects, I'll create one as an example 
     let instance = T.init(json: json) 

     return [instance] 
    } 
} 

ので、私はより多くの情報のためThe Swift Programming LanguageGenerics章のType Constraintsセクションをチェックアウトをお勧めしたいです。

関連する問題