2016-12-16 8 views
5

Здравствуйте, я новичок в swift, и я следую учебному курсу и создаю тот же код для загрузки изображения. Я теперь использую swift 3 и кажется NSMutableData() больше не имеет appendString Доступен способ, что я могу сделать в качестве замены? В учебнике я следую здесь http://swiftdeveloperblog.com/image-upload-example/ и мой код этоiOS swift NSMutableData не имеет имени appendString

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

     if parameters != nil { 
      for (key, value) in parameters! { 
       body.("--\(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(options: <#T##NSData.Base64EncodingOptions#>)("--\(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.appendString("\r\n") 



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

     return body 
    } 

Опять вопрос с appendString, как я получаю сообщение об ошибке:

значение типа NSMutableData не имеет ни одного члена appendString

Я искал работу вокруг, но не нашел ни одного, и у меня есть append, но он не принимает строку.

+1

'NSMutableData' никогда не имел' метод appendString', учебник вы смотрите добавляет этот метод в расширении в нижней части их исходного кода. – dan

ответ

11

Как @dan указывает на комментарии, этот метод является частью учебника, на которое вы смотрите. Однако это довольно легко в Swift без определения пользовательского метода.

Во-первых, не используйте NSMutableData; вместо того, чтобы использовать новый Data-структуру, которая будет либо изменяемым или неизменяемым в зависимости от того, используете ли вы var или let:

var body = Data() 

Затем добавить UTF-8 байт:

body.append(Data("foo".utf8)) 

(Есть и другие String методы для других кодировок, если вам нужно что-то иное, чем UTF-8.)

Если вы хотите получить точное поведение учебника, вот как перевести его метод на Swift 3:

extension Data { 
    mutating func append(string: String) { 
    let data = string.data(
     using: String.Encoding.utf8, 
     allowLossyConversion: true) 
    append(data!) 
    } 
} 

… 

body.append("foo") 

Я бы не рекомендовал этот код по двум причинам. Во-первых, преобразование с потерями означает, что ваше приложение может молча отбрасывать важные данные. Во-вторых, разворот силы (data! вместо data) означает, что в случае сбоя в кодировке ваше приложение будет разбиваться, а не отображать полезную ошибку.

+0

Не заставляйте разворачивать данные 'расширения данных { мутирует функ Append (строка: String) { охранник пусть данные = string.data (с помощью: .utf8, allowLossyConversion: истинно) еще {возвращение} Append (данные) } } ' –

+0

@Leo: молча игнорировать ошибку, возможно, даже _worse_, чем сбой. Правильный подход зависит от ситуации: если строка не кодируется, лучше ли (1) ничего не делать и позволить приложению продолжать думать, что приложение успешно выполнено, (2) остановить все, потому что ошибка никогда не должна была произойти, или (3) предпринять некоторые действия по восстановлению, например, отобразить ошибку пользователю? –

1
extension NSMutableData { 

    func appendString(_ string: String) { 
     let data = string.data(using: String.Encoding.utf8, allowLossyConversion: true) 
     append(data!) 
    } 
} 

Эта работа со мной Swift 3