Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS swift NSMutableData没有成员appendString_Ios_Swift_Swift3_Nsmutabledata - Fatal编程技术网

iOS swift NSMutableData没有成员appendString

iOS swift NSMutableData没有成员appendString,ios,swift,swift3,nsmutabledata,Ios,Swift,Swift3,Nsmutabledata,您好,我是swift的新手,我正在学习一个教程,并创建相同的代码来上传图像。我现在使用的是swift 3,似乎NSMutableData()不再有appendString方法可用,我可以做什么来替代?我下面的教程在这里,我的代码是 func createBodyWithParameters(parameters: [String: String]?, filePathKey: String?, imageDataKey: NSData, boundary: String) -> NSDat

您好,我是swift的新手,我正在学习一个教程,并创建相同的代码来上传图像。我现在使用的是swift 3,似乎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
    }
func createBodyWithParameters(参数:[String:String]?,filePathKey:String?,imageDataKey:NSData,boundary:String)->NSData{
let body=NSMutableData()
如果参数!=nil{
用于参数中的(键、值){
正文。(“--\(边界)\r\n”)
body.appendString(“内容处置:表单数据;名称=\”\(键)\”\r\n\r\n”)
body.appendString(“\(值)\r\n”)
}
}
让filename=“user profile.jpg”
让mimetype=“image/jpg”
body.appendString(选项:)(“--\(边界)\r\n”)
body.appendString(“内容处置:表单数据;名称=\”\(filePathKey!)\“文件名=\”\(文件名)\“\r\n”)
body.appendString(“内容类型:\(mimetype)\r\n\r\n”)
body.appendString(“\r\n”)
body.appendString(“--\(边界)--\r\n”)
返回体
}
问题再次出现在appendString上,因为我得到了错误:

NSMutableData类型的值没有成员appendString


我一直在搜索变通方法,但没有找到任何变通方法,我有可用的append方法,但它不需要字符串。

正如@dan在评论中指出的,该方法是您正在阅读的教程的一部分。不过,在Swift中,不需要定义自定义方法就很容易了

首先,不要使用
NSMutableData
;相反,请使用新的
数据
结构,该结构可以是可变的,也可以是不可变的,具体取决于您是使用
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")
不过,出于两个原因,我不推荐使用此代码。首先,有损转换意味着你的应用程序可能会悄悄地丢弃重要数据。其次,强制展开(
数据!
而不是
数据
)意味着如果编码出现问题,你的应用程序将崩溃,而不是显示有用的错误

extension NSMutableData {

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

通过在类ViewController之后添加以下行,我在Swift 4中解决了这个问题:

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
    }

NSMutableData
从未有过
appendString
方法,您正在阅读的教程在其源代码底部的扩展中添加了该方法。不要强制展开数据
扩展数据{mutating func append(string:string){guard let data=string.data(使用:.utf8,allowLossyConversion:true)else{return}append(data)}
@Leo:默默地忽略错误可能比崩溃更糟糕。正确的方法取决于具体情况:如果字符串不可编码,是否最好(1)什么都不做,让应用程序继续认为追加成功,(2)停止所有操作,因为错误永远不会发生,或者(3)采取一些恢复操作,例如向用户显示错误?