iOS swift NSMutableData не имеет члена appendString

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

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, но он не принимает строку.


person Rome Torres    schedule 16.12.2016    source источник
comment
У NSMutableData никогда не было метода appendString, учебник, который вы просматриваете, добавляет этот метод в расширение в нижней части их исходного кода.   -  person dan    schedule 16.12.2016


Ответы (3)


Как отмечает @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) означает, что в случае проблем с кодировкой ваше приложение вылетит вместо отображения полезной ошибки.

person Paul Cantrell    schedule 16.12.2016
comment
Не принудительно разворачивайте данные extension Data { mutating func append(string: String) { guard let data = string.data( using: .utf8, allowLossyConversion: true) else { return } append(data) } } - person Leo Dabus; 16.12.2016
comment
@Leo: молчаливое игнорирование ошибки, возможно, даже хуже, чем сбой. Правильный подход зависит от ситуации: если строка не закодирована, лучше ли (1) ничего не делать и позволить приложению продолжить работу, думая, что добавление прошло успешно, (2) остановить все, потому что ошибка никогда не должна была произойти, или (3) предпринять какие-либо действия по восстановлению, например, отобразить ошибку пользователю? - person Paul Cantrell; 09.02.2017

extension NSMutableData {

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

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

person Abdelhaleem Ali    schedule 23.03.2017

Я решил эту проблему в Swift 4, добавив следующие строки после класса ViewController:

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

Я имею в виду класс Viewcontroller — класс, который создается при добавлении ViewController в ваш проект. пример следующего класса:

   class ViewController2: UIViewController ,UINavigationControllerDelegate , UIImagePickerControllerDelegate{
      // my code
    }
person khaled Debuch    schedule 20.03.2018