2017-02-21 20 views
0

Помогите мне, чтобы преобразовать этот мир кода от Swift 2 Свифта 3:IOS: Swift 2 Свифта 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»

Пожалуйста, помогите найти решение этой проблемы!

Заранее спасибо ...

+1

FWIW, я считаю, что код был адаптирован из [этот ответ] (http://stackoverflow.com/a/26163136/1271826), которая в настоящее время включает в себя Swift 3. – Rob

+0

Спасибо, Роб, это помогает !!! –

ответ

0

Решение выглядит следующим образом:

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

Я сомневаюсь, что код работает даже в Swift 2.

Вы собираетесь создавать тело из строк и возвращает строку результата, как Data. В Swift 3 NSData был заменен нативной структурой Data.

Ошибка возникает из-за того, что вы создаете экземпляр NSMutableData, а затем пытаетесь добавить String s, что невозможно.

Эта версия использует соглашение об именах 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 
} 
Смежные вопросы