how to pass a nil value for one of the parameter i

2020-04-02 17:54发布

I would like to pass a nil value i.e., optional to one of the parameter value. And it must proceed with the nil value in the Alamofire Post request .It would be helpful if you tell me how to proceed next?

    let image: UIImage = UIImage()
    let imageData = UIImagePNGRepresentation(image)
    let base64String = imageData?.base64EncodedStringWithOptions(.Encoding64CharacterLineLength)

    let parameters = [
        "first_name": "XXXXX",
        "email" : "1234@gmail.com",
        "password" : "password",
        "profile_picture" : base64String]

Alamofire.request(.POST, "http://abc/public/user/register", parameters: parameters, encoding: .JSON, headers: nil)

        .progress { bytesWritten, totalBytesWritten, totalBytesExpectedToWrite in
            print(totalBytesWritten)

            // This closure is NOT called on the main queue for performance
            // reasons. To update your ui, dispatch to the main queue.
            dispatch_async(dispatch_get_main_queue()) {
                print("Total bytes written on main queue: \(totalBytesWritten)")
           }
        }
        .responseJSON { response in
            debugPrint(response)
    }

The response should gets succeeded even if the profile_pictures is empty. I know it can be done with optional chaining but don't know how to proceed!!

4条回答
贪生不怕死
2楼-- · 2020-04-02 18:15

By passing nil or uninitialized optional parameter Server will get Optional

You can pass NSNull() to dictionary

try this, like

var params = ["paramA","valueA"] if imageBase64 == nil {   parms["image"] = NSNull()} else {   params["image"] = imageBase64 }

swiftyjson also handle null as NSNull

also there is good reference here null / nil in swift language

查看更多
不美不萌又怎样
3楼-- · 2020-04-02 18:21

I think your simplest answer would be to add "profile_picture" as a second step.

var parameters = [
    "first_name": "XXXXX",
    "email" : "1234@gmail.com",
    "password" : "password"]

if let base64String = base64String where !base64String.isEmpty {
    parameters["profile_picture"] = base64String
}
查看更多
时光不老,我们不散
4楼-- · 2020-04-02 18:34

After a very thorough research, I found out it can be done easily through optional chaining and type casting.

The first step it to divide the parameters by type casting it to string and Image and check for the availability of String value and Image value.

let parameters: [String : AnyObject? ] = [
    "first_name": "XXXXX",
    "email" : "1234@gmail.com",
    "password" : "password",
    "profile_pic" : UIImage(named: "logo")]

Do it like this in the request method

for (key, value) in parameters {

                if let value1 = value as? String {
                    multipartFormData.appendBodyPart(data: value1.dataUsingEncoding(NSUTF8StringEncoding)!, name: key)
                }
                if let value1 = value as? UIImage {
                  let imageData = UIImageJPEGRepresentation(value1, 1)
                      multipartFormData.appendBodyPart(data: imageData!, name: key, fileName: "logo.png" , mimeType: "image/png")
                    }

You don't have to split the parameters into two, one for the string values and other for the image and also it is unnecessary to convert the image to string. Hope this solution helps!!

查看更多
疯言疯语
5楼-- · 2020-04-02 18:36

hope this will help you :)

var parameters :[String : AnyObject?] = [
    "first_name": "XXXXX",
    "email" : "1234@gmail.com",
    "password" : "password"]

if let string = base64String where base64String.isEmpty != false {
  parameters["profile_picture"] = string 
} 
查看更多
登录 后发表回答