2016-12-16 18 views
5

Witam Jestem nowy na szybki i postępuję zgodnie z samouczkiem i tworzeniem tego samego kodu w celu przesłania obrazu. Używam teraz szybkiego 3 i wygląda na to, że NSMutableData() nie ma już dostępnej metody appendString, co mogę zrobić jako substytut? Tutorial śledzę tu http://swiftdeveloperblog.com/image-upload-example/ i mojego kodu jest toiOS swift NSMutableData nie ma członka 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 
    } 

Znowu problem jest z appendString jak ja dostaję błąd:

wartość typu NSMutableData ma człon appendString

Szukałem pracy dookoła, ale nie znalazłem żadnej i mam dostępną metodę do uzupełnienia, ale nie wymaga ona ciągu.

+1

'NSMutableData' nigdy nie miał' metody appendString', tutorial patrzysz dodaje, że sposób, w rozszerzeniu na dnie ich kodu źródłowego. – dan

Odpowiedz

11

Jak zaznacza @dan w komentarzach, ta metoda jest częścią samouczka, który przeglądasz. W Swift jest to łatwe, ale bez zdefiniowania niestandardowej metody.

Po pierwsze, nie używaj NSMutableData; Zamiast korzystać z nowego Data struct, który będzie albo zmienne lub niezmienne w zależności od tego, czy używasz var lub let:

var body = Data() 

Następnie dołączyć UTF-8 bajtów:

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

(istnieją inne String metody dla innych kodowań, jeśli potrzebujesz czegoś innego niż UTF-8.)

Jeśli chcesz dokładnie zachować samouczek, oto jak przetłumaczyć jego metodę na Swift 3:

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

… 

body.append("foo") 

Nie polecam tego kodu z dwóch powodów. Po pierwsze, stratna konwersja oznacza, że ​​aplikacja może po cichu odrzucić ważne dane. Po drugie, rozwijanie siły (data! zamiast data) oznacza, że ​​w przypadku problemów z kodowaniem aplikacja ulegnie awarii zamiast wyświetlenia użytecznego błędu.

+0

Nie wymuszaj odwijania danych Rozszerzenie danych { muting append (ciąg: String) { straży niech dane = string.data (przy użyciu: .utf8, allowLossyConversion: true) else {return} append (data) } } ' –

+0

@Leo: ciche zignorowanie błędu jest prawdopodobnie nawet _właścisze niż awarie. Prawidłowe podejście zależy od sytuacji: jeśli łańcuch nie jest możliwy do kodowania, czy lepiej (1) nic nie robić i pozwolić aplikacji kontynuować myślenie, że dołączenie się powiedzie, (2) zatrzymać wszystko, ponieważ błąd nigdy nie powinien był się wydarzyć, lub (3) podjąć pewne działania naprawcze, takie jak wyświetlenie błędu użytkownikowi? –

1
extension NSMutableData { 

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

Ta praca With Me Swift 3

Powiązane problemy