• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Die Bildungsoffensive hier im Forum geht weiter! Jetzt sollen Kreativität und technische Möglichkeiten einen neue Dimension erreichen. Das Thema in diesem Monat lautet - Verkehrte Welt - Hier geht es lang --> Klick

Prüfen ob ein String exisitert

belinea

deaktivierter Benutzer
Registriert
12.07.08
Beiträge
351
Ich will mit
Code:
var server = NSUserDefaults.standardUserDefaults().objectForKey("defaultServer")! as! String[code]

eine
eine gespeicherte Einstellung auslesen. Ein String der unter dem Key defaultServer gespeichert ist.

Zum Überprüfen was in dem String steht und ob er leer ist komme ich jedoch gar nicht, weil die App schon abstürzt falls der Key defaultServer nicht existent ist.

Ich denke das hat mit dem unwrappen des Strings zu tun. Bei einem force unwrap (mit as!) gebe ich ja vor dass ich mir zu 100% sicher bin dass der String nicht leer ist. Ist das der Fehler begraben?
 
Ich denke das hat mit dem unwrappen des Strings zu tun. Bei einem force unwrap (mit as!) gebe ich ja vor dass ich mir zu 100% sicher bin dass der String nicht leer ist.
Das siehts du richtig. Wenn du dir nicht sicher sein kannst, dass der String existiert, darfst du nicht „forced unwrappen“. Du musst also statt as! eben as? verwenden. Das erste Ausrufezeichen (das nach objectForKey()) ist auch schon zu viel.
Code:
if let server = NSUserDefaults.standardUserDefaults().objectForKey("defaultServer") as? String (
    ....
}
Oder, wenn klar ist, dass es um einen String geht:
Code:
if let server = NSUserDefaults.standardUserDefaults().stringForKey("defaultServer") {
    ...
}
Hier noch Lesestoff zu Optionals. Es ist generell empfehlenswert, sich mal das ganze Swift Buch von Apple durch zu lesen.
 
  • Like
Reaktionen: belinea
Bekomme leider einer Fehlermeldung mit der ich nichts anfangen kann.

Im Playground funktioniert die Schreibweise. Im der Klasse ViewController jedoch nicht.
 

Anhänge

  • Bildschirmfoto 2015-08-10 um 20.58.10.png
    Bildschirmfoto 2015-08-10 um 20.58.10.png
    25,6 KB · Aufrufe: 52
Du schreibst ins "Nichts". Du bist weder in einer Methode der Klasse, noch in einer Variablendeklaration oder ähnliches. Müsstest deine Überprüfung also bspw. in eine Methode packen.
 
  • Like
Reaktionen: belinea
Ich war direkt in der ViewController Klasse und in keiner Funktion.
 
Und genau das ist das Problem. Wann soll diese Zeile ausgeführt werden? Einfach zusammenhanglos etwas innerhalb einer Klasse prüfen kannst du nicht. Du musst innerhalb einer Methode innerhalb der Klasse sein. Der Playground ist hier ein Sonderfall, da dieser einfach jede Zeile auswertet.

Ich würde dir auch nochmal dringend empfehlen das Swift-Buch von Apple oder einen anderen Kurs von vorne bis hinten durchzuarbeiten. Sonst wirst du immer wieder an so Dingen hängenbleiben, weil dir grundlegendes Veständnis von Zusammenhängen fehlt.
 
Schreibe ich es jedoch in eine Funktion, dann ist diese Variable dann nicht mehr global verfügbar in der Klasse. Ich kann nur innerhalb der Funktion auf diese Variable zugreifen.

Weise ich gleich nach
Code:
class ViewController: UIViewController {


einer Variable einen Wert zu, kann ich dann in jeder Funktio auf diese Variable zugreifen. Ich kann aber dann nicht mit IF prüfen ob die Variable leer ist wenn sie ausserhalb einer Klasse definiert wird. Ich kann nur die Variable zuweisen und einen force unwrap drauf anwenden und Gefahr laufen dass die App abstürzt.

Ich mache den Fehler mich über die ganzen APIs die Apple einem Apple zur Verfügung stellt um die tollste Sachen zu machen, scheitere dann aber an den Grundlagen.

Ich sollte einfach noch mal bei Null anfangen und jede Grundlagen nochmal verinnerlichen, wie du schon sagst.
 
Zuletzt bearbeitet:
Habe gelesen dass man, wie ich eigentlich auch schon unter PHP mache, globale Variablen nicht nutzen soll.
 
[QUOTE="belinea, post: 4679882, member: 53646"
...Ich kann aber dann nicht mit IF prüfen ob die Variable leer ist wenn sie ausserhalb einer Klasse definiert wird. Ich kann nur die Variable zuweisen und einen force unwrap drauf anwenden und Gefahr laufen dass die App abstürzt.
[/QUOTE]

Du kannst aber mit "if let" prüfen ob die Variable einen Wert hat, damit nicht gleich deine App abstürzt.
https://developer.apple.com/library...ft_Programming_Language/OptionalChaining.html
 
  • Like
Reaktionen: belinea
Habe gelesen dass man, wie ich eigentlich auch schon unter PHP mache, globale Variablen nicht nutzen soll.
Aber ist es nicht reichlich unperformant in jeder Funktion immer und immer wieder die NSUserDefaults auszulesen?

Ich dachte mir ich mache das einmal bei ViewDidLoad und habe den Wert dann in jeder Funktion zur Verfügung. Aber in der Funktion ViewDidLoad zugewiesenen Variablen sind eben nicht global und ich kann sie in anderen Funktionen nicht nutzen.

Ist es also wirklich eine geeignete Lösung in jeder Funktion den Wert aus der NSUserDefaults auszulesen?
 
Was du suchst, sind vermutlich Properties: https://developer.apple.com/library...al/Swift_Programming_Language/Properties.html

Dann hätte dein ViewController eine Property "server" und du könntest auf den Wert der Variable mit self.server zugreifen. Einen Wert in die Property kannst du dann wie geplant in viewDidLoad schreiben. In jeder Funktion die UserDefaults auslesen ist nicht schön, würde aber jetzt noch keine ruckelnde App bewirken ;)
 
  • Like
Reaktionen: belinea
So werde ich das umsetzen und die Properties nutzen. Danke.