iOS: Swift 2 to Swift 3: 将字符串转换为数据

iOS: Swift 2 to Swift 3: Convert Strings to Data

帮我把代码从 Swift 2 转换成 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
}

所有变量类型应该相同。 问题是找到 "appendString" 函数的替代方法来将所有这些数据和字符串连接在一起。 我的主要错误是使用追加函数:

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

错误:无法将类型 'String' 的值转换为预期的参数类型 'Data'

请帮助找到该问题的解决方案!

提前致谢...

我怀疑代码在 Swift 2.

中是否有效

您将用字符串组成正文,return 结果字符串为 Data。在 Swift 3 NSData 中已替换为原生结构 Data.

错误发生是因为您创建了一个 NSMutableData 实例,然后您尝试附加 Strings,这是不可能的。

此版本使用 Swift 3 命名约定 (createBody(with parameters:...),创建复合字符串,将字符串转换为 Data 并附加图像数据和后缀。

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
}

解决方案如下:

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