2017-05-26 6 views
1

Ich bin neu bei Swift und als ich über die Initialisierung einer Zeichenfolge lerne, finde ich eine verdrahtete Syntax, die ich nicht verstehen kann.swift 3.0 Probleme bei der String-Initialisierung

Zum Beispiel Wenn ich initialisieren eine Zeichenfolge mit:

var str:String = "Hello, playground" 
    str.isEmpty 

Das funktioniert gut

Allerdings, wenn ich einen String mit einem Konstruktor

var str = String("Hello, playground") 
str.isEmpty 

das funktioniert nicht initialisiert werden. Und der Compiler fixiert, indem die Syntax

str?.isEmpty 

ändert ich keine Ahnung von dem, was ist das? „“ Für. Jeder Vorschlag wird geschätzt.

+1

http://www.appcoda.com/beginners-guide-optionals-swift/ – PeejWeej

+1

Lesen Sie das Swift Handbuch, Kapitel "Optionals". Sehr wichtig. – Moritz

Antwort

2

Wenn Sie sagen:

let str = String("Hello, playground") 

Sie verwenden String 's init?(_ description: String) initialiser, die LosslessStringConvertible erfüllt ist initialiser Anforderung, da nicht alle Typen, die für eine eine Darstellung entsprechen beliebig Zeichenfolge (z. B. Double).

Da die initialiser failable ist, gibt es eine optionale String-Instanz (d String?), also warum die Compiler Sie auffordert, optional Verkettung zu verwenden (wenn nicht schon, ich würde die optionals section of the language guide Lektüre empfehlen).

Allerdings ist es erwähnenswert, es gibt absolut keine Notwendigkeit für String ‚s Umsetzung dieser initialiser failable zu sein - als ein String immer einen String darstellen kann! Diese will be fixed in Swift 4, wird es als ein nicht-failable-Initialisierer implementiert werden, der die failable-Anforderung erfüllt. Dies liegt daran, dass es den Vertrag nicht mit dem Protokoll unterbricht, entweder eine neue Instanz odernil zurückzugeben (es passiert einfach nie, das Letztere zu tun).

In der Zwischenzeit können Sie jedoch nur zwingen, das Ergebnis auszupacken, wie es immer gelingen wird. Aber der Einsatz des Initialisierers ist hier völlig überflüssig.Sie sollten einen Zeichenfolgenliteral, wie in Ihrem ersten Beispiel verwenden:

let str = "Hello, playground" 

str wird einfach mit dem Inhalt des Stringliteral auf eine nicht-optionale String Instanz initialisiert werden. Beachten Sie, dass Swift zustr des Typs String schließen kann - Sie müssen es nicht explizit als solches annotieren.

+0

Es mag erwähnenswert sein, dass (wie in diesem Fall) ein nicht-failable Initialisierer die Protokollanforderung eines fehlgeleiteten Initialisierers (oder "Initialisierer", wie Sie sagen würden) erfüllen kann: –

+0

@MartinR Gute Idee - das habe ich jetzt getan :) – Hamish

+0

@MartinR Und yeah ... hol mich nicht auf die amerikanische Sprache der Worte;) – Hamish

0

var str = String ("Hallo, Spielplatz")

Dies erzeugt, was ein "Optional" genannt wird. Wenn in Swift ein Wert null/null sein kann, wird es in ein Optional eingeschlossen. Das '?' versucht das optionale zu entpacken und einen String zu erzeugen.

Wenn Sie wissen, dass der Wert nie Null sein kann, dann kann man es wie folgt auspacken erzwingen:

var str = String("Hello, playground") 
str!.isEmpty 

oder

var str2 = String("Hello, playground")! 
str2.isEmpty 

Generell sind aber gezwungen Abwickeln ist verpönt, wie es kann zu Abstürzen führen. Bessere Ansätze:

struct MyError:Error { 
    var message:String 
} 

guard let str3 = String("Hello, playground") else { 
    throw MyError(message:"failed") 
} 
str3.isEmpty 


if let str4 = String("Hello, playground") { 
    str4.isEmpty 
}