Neko
Neko

Reputation: 589

How to convert Objective-C block to Swift closure

I have a method that contains an block which defined in Objective - C:

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

and I invoke it like:

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

in Objective - C .

Now I want invoke it in Swift 3.2 :

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

  })

but I always got an error:

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

can some one help me the right way to invoke it? thanks.

Upvotes: 0

Views: 2404

Answers (3)

Ramanpreet Singh
Ramanpreet Singh

Reputation: 91

//MARK: Class function to pass requestModel and get response model

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 
    })

Upvotes: 3

Pushpendra
Pushpendra

Reputation: 986

Try this:

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


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

})

Upvotes: 2

Sweeper
Sweeper

Reputation: 274835

In Swift, closures can be very easily written. The compiler infers the parameter types and return type for you, so all you need to do is write the parameter name and in:

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

You can also use the trailing closure syntax:

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

The error occurs because resModel actually is of an optional type. iN the original Objective-C code, resModel was a pointer, which can be null. When this is bridged to swift, it turns into NewListResponseModel?.

Upvotes: 6

Related Questions