2016-09-09 6 views
1

たとえば、コマンドを実行するCommanderオブジェクトがあります。戻り値の型は常に同じではなく、コマンドに応じて変化します。指定された汎用関数パラメータへのキャスト

コマンドをコマンダーに転送し、その結果が特定の型(パラメータとして渡されたもの)かどうかをテストし、キャストが成功した場合に成功クロージャを呼び出す前にテストし、それ以外の場合は失敗の終了となります。

私はこのようなもので、一般的なパラメータを使用して試してみた:それをそのよう

self.postCommand("command", expectedResponseType: [String: AnyObject], success: { (content: [String: AnyObject]) in 
    print("Success") 
}) { (error: NSError?) in 
    print("Failure") 
} 

を呼び出す

func postCommand<T>(command: String, expectedResponseType: T, success: T -> Void, failure: (NSError?) -> Void) { 
    Commander.execute(command, completion: { (response: AnyObject?) in 
     guard let content = response as? T else { 
      failure(nil) 
      return 
     } 
     success(content) 
    }) 
} 

しかし、私は、コンパイラからエラーを取得する:

Cannot convert value of type '([String : AnyObject]) -> Void' to expected argument type '_ -> Void' 

このようなキャストをしようとすると:

guard let content = response as? expectedResponseType 

コンパイラはexpectedResponseTypeが型ではないと不平を言っています。

私はそれを行う方法を理解できません。それも可能ですか?

答えて

1

問題はキャストではなく、expectedResponseType:パラメータのタイプです。

型を関数に渡す場合は、引数の型としてthe metatype typeを使用する必要があります。この場合、関数のexpectedResponseType:パラメータはT.Typeである必要があります。Tを定義する型を渡すことができます。

func postCommand<T>(_ command: String, expectedResponseType: T.Type, success: (T) -> Void, failure: (NSError?) -> Void) { 
    // ... 
} 

また、あなたがexpectedResponseType:パラメータに渡すものは何でもの実際の型を参照するために、接尾辞.selfを使用する必要があります:あなたは注意する必要がありますが

self.postCommand("command", expectedResponseType: [String: AnyObject].self, success: { content in 
    print("Success") 
}) { error in 
    print("Failure") 
} 

そのTの種類あなたが関数に渡す成功の閉鎖から直接推測することができます。

func postCommand<T>(_ command: String, success: (T) -> Void, failure: (NSError?) -> Void) { 
    // ... 
} 

self.postCommand("command", success: { (content: [String: AnyObject]) in 
    print("Success") 
}) { error in 
    print("Failure") 
} 
関連する問題