2016-12-16 17 views
5

Xin chào Tôi mới đến nhanh và tôi đang làm theo hướng dẫn và tạo cùng một mã để Tải lên hình ảnh. Tôi hiện đang sử dụng nhanh 3 và có vẻ như NSMutableData() không còn có phương thức appendString tôi có thể làm gì để thay thế? Các hướng dẫn, tôi đang theo là ở đây http://swiftdeveloperblog.com/image-upload-example/ và mã của tôi là thế nàyNSMutableData nhanh chóng cho iOS không có thành viên 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 
    } 

Một lần nữa vấn đề là với appendString như tôi nhận được lỗi:

giá trị của loại NSMutableData không có thành viên appendString

Tôi đang tìm kiếm các công việc xung quanh nhưng chưa tìm thấy và tôi có nối thêm phương thức nhưng không có chuỗi.

+1

'NSMutableData' chưa bao giờ có một' phương pháp appendString', các hướng dẫn, bạn đang xem xét bổ sung thêm phương pháp mà trong một phần mở rộng ở dưới cùng của mã nguồn của họ. – dan

Trả lời

11

Khi @dan chỉ ra trong nhận xét, phương pháp đó là một phần của hướng dẫn bạn đang xem. Tuy nhiên, thật dễ dàng trong Swift mà không định nghĩa phương thức tùy chỉnh.

Trước tiên, không sử dụng NSMutableData; thay vào đó, sử dụng Data cấu trúc mới, mà sẽ là một trong hai có thể thay đổi hoặc không thay đổi tuỳ thuộc vào việc bạn sử dụng var hoặc let:

var body = Data() 

Sau đó, để thêm UTF-8 byte:

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

(Có khác String phương pháp để mã hóa khác nếu bạn cần một cái gì đó khác hơn là UTF-8.)

Nếu bạn muốn hành vi chính xác của hướng dẫn, đây là cách dịch phương pháp của nó sang Swift 3:

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

… 

body.append("foo") 

Tôi sẽ không đề xuất mã này vì hai lý do. Đầu tiên, chuyển đổi mất mát có nghĩa là ứng dụng của bạn có thể âm thầm loại bỏ dữ liệu quan trọng. Thứ hai, các lực unwrap (data! thay vì data) có nghĩa là trong trường hợp mã hóa rắc rối, ứng dụng của bạn sẽ sụp đổ thay vì hiển thị một lỗi hữu ích.

+0

Không buộc mở rộng dữ liệu của bạn 'dữ liệu mở rộng { thay đổi nối thêm func (string: String) { guard let data = string.data (sử dụng: .utf8, allowLossyConversion: true) else {return} chắp thêm (dữ liệu) } } ' –

+0

@Leo: âm thầm bỏ qua lỗi có thể thậm chí là _worse_ hơn là lỗi. Cách tiếp cận chính xác phụ thuộc vào tình huống: nếu chuỗi không được mã hóa, tốt hơn là (1) không làm gì cả và để ứng dụng tiếp tục nghĩ rằng nối thêm đã thành công, (2) dừng mọi thứ vì lỗi không bao giờ xảy ra, hoặc (3) thực hiện một số hành động khôi phục, chẳng hạn như hiển thị lỗi cho người dùng? –

1
extension NSMutableData { 

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

Công việc này With Me Swift 3

Các vấn đề liên quan