【问题标题】:iOS swift NSMutableData has no member appendStringiOS swift NSMutableData 没有成员 appendString
【发布时间】:2016-12-16 18:34:29
【问题描述】:

您好,我是 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 方法可用,但它不需要字符串。

【问题讨论】:

  • NSMutableData 从未有过 appendString 方法,您正在查看的教程将该方法添加到源代码底部的扩展中。

标签: ios swift swift3 nsmutabledata


【解决方案1】:

正如@dan 在 cmets 中指出的那样,该方法是您正在查看的教程的一部分。不过,在 Swift 中这很容易,无需定义自定义方法。

首先,不要使用NSMutableData;相反,使用新的Data 结构,根据您使用的是var 还是let,该结构将是可变的或不可变的:

var body = Data()

然后追加 UTF-8 字节:

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

(如果您需要 UTF-8 以外的其他编码,还有其他 String 方法。)

如果您想要本教程的确切行为,以下是将其方法转换为 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)意味着如果出现编码问题,您的应用将崩溃而不是显示有用的错误。

【讨论】:

  • 不要强行解包你的数据extension Data { mutating func append(string: String) { guard let data = string.data( using: .utf8, allowLossyConversion: true) else { return } append(data) } }
  • @Leo:默默地忽略错误可能比崩溃更更糟糕。正确的方法取决于具体情况:如果字符串不可编码,最好 (1) 什么都不做,让应用程序继续认为附加成功,(2) 停止一切,因为错误本不应该发生,或者(3) 采取一些恢复措施,例如向用户显示错误?
【解决方案2】:
extension NSMutableData {

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

这与我一起工作 Swift 3

【讨论】:

    【解决方案3】:

    我在 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
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多