2016-07-11 5 views
0

hier gelöst zu werden ist mein Code:Swift String Bau war zu komplex, um in angemessener Zeit

let request = NSMutableURLRequest(URL: NSURL(string: "http://www.example.com/submit.php")!) 
request.HTTPMethod = "POST" 
let postString = "user_name="+user_name+"&first_name="+first_name.text+"&last_name="+last_name.text+"&company_name="+company_name.text+"&location="+location.text+"&phone="+phone.text+"&website="+website.text+"&email="+email.text+"&about="+about.text 
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in 
    let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding) 
    print("responseString = \(responseString)") 
} 
task.resume() 

wenn ich versuche, um die App zu laufen, es gibt mir die folgende Fehlermeldung auf postString:

Ausdruck war zu komplex, um in angemessener Zeit gelöst zu werden; Sehen Sie den Ausdruck in verschiedene Unterausdrücke Zerschlagung

+0

Tun Sie, was der Compiler sagt Ihnen. Anstatt alles in den gleichen Ausdruck zu stopfen, machen Sie mehrere, es hilft dem Compiler zu wissen, was passiert. :) – Moritz

+0

@EricD danke dafür. Wie würde ich es tun? – johnniexo88

+0

Sie haben eine große Deklaration von 'postString' mit vielen Variablen, die Sie zu Strings hinzufügen, in einer einzigen Zeile. Stattdessen machen Sie zuerst einen Teil davon, wie die Namen, und speichern Sie diesen in einer Variablen. Fügen Sie dann den Rest hinzu und verwenden Sie eine andere Zeile. Wie 'let names = xxx + xxx', dann lass 'postString = names + xxx + xxx', etc. – Moritz

Antwort

1

Versuchen Sie folgendes:

let parameters = ["user_name" : user_name, 
    "first_name" : first_name.text, 
    "last_name" : last_name.text, 
    "company_name" : company_name.text, 
    "location" : location.text, 
    "phone" : phone.text, 
    "website" : website.text, 
    "email" : email.text, 
    "about" : about.text].map { "\($0)=\($1 ?? "")" } 
let postString = parameters.joinWithSeparator("&") 

Die Lösung wird zunächst ein Wörterbuch mit den Parametern und deren Werte schaffen (dies kann auch die Lesbarkeit und Wartbarkeit des Codes verbessern).

Dann wird es ausführen eine „Karte“ auf diesem Wörterbuch, es in ein Array von Strings drehen key=value enthält (und wenn da text auf UITextField optional ist, wird er es auf einen leeren String gesetzt, wenn es null).

Schließlich wird es eine Zeichenfolge erstellen, indem Sie alle Strings im Array mit dem Separator Verbindungs ​​&

+0

Was bedeutet das? '.map {" \ ($ 0) = \ ($ 1 ?? "") "}' – johnniexo88

+0

Die 'map' transformiert das Dictionary in ein Array von Strings $ 0 = der Schlüssel und $ 1 = der Wert im Dictionary.Für weitere Informationen über die map-Funktion, http: //useyourloaf.com/blog/swift-guide-to-map-filter-reduce/ Kurz gesagt, führen Sie für jedes Element in dem, was wir zuordnen, diese Funktion aus, und speichern Sie den Rückgabewert dieser Funktion in einem neuen Array – Mattias