0

Help me to convert that peace of code from Swift 2 to Swift 3:

func createBodyWithParameters(parameters: [String: String]?, filePathKey: String?, imageDataKey: NSData, boundary: String) -> NSData {
    let body = NSMutableData();

    if parameters != nil {
        for (key, value) in parameters! {
            body.appendString("--\(boundary)\r\n")
            body.appendString("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
            body.appendString("\(value)\r\n")
        }
    }
            let filename = "user-profile.jpg"
            let mimetype = "image/jpg"

            body.appendString("--\(boundary)\r\n")
            body.appendString("Content-Disposition: form-data; name=\"\(filePathKey!)\"; filename=\"\(filename)\"\r\n")
            body.appendString("Content-Type: \(mimetype)\r\n\r\n")
            body.appendData(imageDataKey)
            body.appendString("\r\n")

    body.appendString("--\(boundary)--\r\n")

    return body
}

All of variables types should be the same. Problem is to find alternative of "appendString" function to concatenate all of this data and strings together. My main mistake is to using append function:

body.append("--\(boundary)\r\n")

Error: Cannot convert value of type 'String' to expected argument type 'Data'

Please help to find solution of that problem!

Thanks in advance...

Oleg Savelyev
  • 275
  • 4
  • 16

2 Answers2

0

I doubt that the code even works in Swift 2.

You are going to compose the body out of strings and return the result string as Data. In Swift 3 NSData has been replaced with native struct Data.

The error occurs because you create an NSMutableData instance and then you try to append Strings which is not possible.

This version uses the Swift 3 naming convention (createBody(with parameters:...), creates the compound string, converts the string to Data and appends the image data and the suffix.

func createBody(with parameters: [String: String]?, filePathKey: String?, imageDataKey: Data, boundary: String) -> Data
{
    var body = ""

    if let params = parameters {
        for (key, value) in params {
            body += "--\(boundary)\r\n"
            body += "Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n"
            body += "\(value)\r\n"
        }
    }
    let filename = "user-profile.jpg"
    let mimetype = "image/jpg"

    body += "--\(boundary)\r\n"
    body += "Content-Disposition: form-data; name=\"\(filePathKey!)\"; filename=\"\(filename)\"\r\n"
    body += "Content-Type: \(mimetype)\r\n\r\n"

    var data = body.data(using: .utf8)!
    data.append(imageDataKey)
    data.append("\r\n--\(boundary)--\r\n".data(using: .utf8)!)

    return data
}
vadian
  • 274,689
  • 30
  • 353
  • 361
0

Solution looks like:

func createBodyWithParameters(parameters: [String: String]?, filePathKey: String?, imageDataKey: NSData, boundary: String) -> NSData {

    let body = NSMutableData()

    if parameters != nil {
        for (key, value) in parameters! {
            body.appendString(string: "--\(boundary)\r\n")
            body.appendString(string: "Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n")
            body.appendString(string: "\(value)\r\n")
        }
    }

    let filename = "logo.jpg"
    let fileNo2 = imageView.image;
    print("fileNo2")
    let mimetype = "image/jpg"

    body.appendString(string: "--\(boundary)\r\n")
    body.appendString(string: "Content-Disposition: form-data; name=\"\(filePathKey!)\"; filename=\"\(filename)\"\r\n")
    body.appendString(string: "Content-Type: \(mimetype)\r\n\r\n")
    body.append(imageDataKey as Data)
    body.appendString(string: "\r\n")



    body.appendString(string: "--\(boundary)--\r\n")

    return body
}

extension NSMutableData {

func appendString(string: String) {
    let data = string.data(using: String.Encoding.utf8, allowLossyConversion: true)
    append(data!)
}
}
Oleg Savelyev
  • 275
  • 4
  • 16