2017-08-31 5 views
0

をObjective-Cのブロックを変換するために、私は客観的に定義されたブロックが含まれている方法がある - C:どのようスウィフト閉鎖に

+(void)getNewList:(NewListRequestModel *)model returnInfo:(void(^)(NewListResponseModel* resModel))retModel; 

を、私はそれが好き呼び出す:

[API getNewList:model returnInfo:^(NewListResponseModel *resModel) { 
     //code 
}]; 

目的で - C。

今、私はスウィフト3.2でそれを呼び出したい:

API.getNewList(model, returnInfo: {(resModel: NewListResponseModel) ->() in 
     //my code  

    }) 

が、私は常にエラーを得た:

Cannot convert value of type '(NewListResponseModel) -> Void' to expected argument type '((NewListResponseModel?) -> Void)!' 

いくつかのいずれかが私にそれを呼び出すための正しい方法を助けることができますか?ありがとう。

答えて

4

を、クロージャは非常に簡単に書き込むことができます。コンパイラは、パラメータの型を推測し、あなたのための型を返すので、あなたがする必要があるすべては、パラメータ名とinを書きです:

API.getNewList(model, returnInfo: {resModel in 
    //my code  
}) 

ます。また、末尾の閉鎖構文を使用することができます。

API.getNewList(model) {resModel in 
    //my code 
} 

resModelは実際にはオプションタイプなのでエラーが発生します。元のObjective-CコードのresModelはポインタであり、nullでもかまいません。これを迅速にブリッジすると、NewListResponseModel?に変わります。

2

はこのお試しください:スウィフトで

class func getNewList(model: NewListResponseModel 
    returnInfo: ((_ resModel: NewListResponseModel?) -> Void)?){ 
    } 


API.getNewList(model, returnInfo: {(resModel) in 
    //my code  

}) 
+0

を取得するには?しかし、私がそれを書き直したくなければ、objective-cメソッドを呼び出してください。あなたは正しい方法を教えていただけますか? – Neko

+0

インポートの目的ヘッダーファイルをブリッジする際に-c classを呼び出し、関数を呼び出します。 – Pushpendra

+0

それは動作します、ありがとう! – Neko

2

// MARK:クラスの機能あなたが迅速な関数に書き換え意味REQUESTMODELを渡し、応答モデル

class func getNewList(model: NewListRequesstModel, completion: @escaping (returnModel: NewListResponseModel) -> Void) { 
      //Your code to get new model for retrun 
    } 

API.getNewList(model: newModelObject, completion: { (retunModelobject) in 
     //your code 
    })