UITextField !

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • UITextField !

    Hallo,
    ich hoffe dieses Thema entartet nicht wieder in einen Glaubenskrieg. Aber ich muss trotzdem fragen:

    Optionals sind Werte die den Wert nil haben dürfen. Wenn man sich die UITextField Datei ansieht dann findet man dort folgendes:

    Quellcode

    1. ​class UITextField : UIControl, UITextInput, UIKeyInput, UITextInputTraits, NSObjectProtocol, NSCoding {
    2. var text: String! // default is nil
    3. var attributedText: NSAttributedString! // default is nil
    4. var textColor: UIColor! // default is nil. use opaque black
    5. var font: UIFont! // default is nil. use system font 12 pt
    6. ... }
    Alles anzeigen



    Hier sehen wir mehrere Instanzvariablen deren default Wert nil ist. Lese ich den text aus, dann bekomme ich einen Wert der auch, wenn das Feld leer ist, nil ist.

    Quellcode

    1. ​let text = self.textField.text


    Aber let text definiert mir doch hier eine non-optional und hält dann nil?
    In einer der WWDC 14 Folgen zu Swift wurde gesagt, dass man die Optionals entweder mit ! (forced unwrapping) oder mit if let entpacken soll, dies ist aber eine einfache Zuweisung und ich dachte mein Programm crasht gleich, aber nein es läuft und text kann den Wert nil haben. Warum? Was habe ich da übersehen?
  • Dieser Satz ist doch nicht wirr^^ Aber gut, Wurscht.

    Quellcode

    1. ​ if let firstname = self.textFieldFirstname.text {
    2. println("firstname exists")
    3. } else {
    4. let alert = UIAlertView(title: "Error", message: "NoFirstName", delegate: nil, cancelButtonTitle: "OK")
    5. alert.show()
    6. }
    Alles anzeigen


    Ich erwarte mir, dass dieser Code in den else Zweig geht, wenn nichts im TextField steht.
    Warum erwarte ich mir das, weil default nil ist. Was bekomme ich? Einen String, der empty ist.
  • joejohannesjoe schrieb:

    Dieser Satz ist doch nicht wirr^^ Aber gut, Wurscht.

    Quellcode

    1. ​ if let firstname = self.textFieldFirstname.text {
    2. println("firstname exists")
    3. } else {
    4. let alert = UIAlertView(title: "Error", message: "NoFirstName", delegate: nil, cancelButtonTitle: "OK")
    5. alert.show()
    6. }
    Alles anzeigen


    Ich erwarte mir, dass dieser Code in den else Zweig geht, wenn nichts im TextField steht.
    Warum erwarte ich mir das, weil default nil ist. Was bekomme ich? Einen String, der empty ist.


    ja und genau das erwarte ich mir.
    eben weil der getter so umgesetzt ist (du greifst ja nicht auf die ivar zu !??!?)
  • joejohannesjoe schrieb:

    Natürlich greife ich auf text zu was eine Instanzvariable ist. Ob dahinter ein Getter steht sehe ich, als nicht Apple Ingenieur ja nicht. Ich sehe nur var text: String! // default is nil
    Und daher erwarte ich mir eventuell nil, wenn da nix drinnen steht. Oder was meinst du genau?


    ich kenn mich in swift nicht aus aber ich gehe davon aus dass du NICHT auf die instanzvariablen zugreifst sondern auf den entsprechenden getter.
    und wie dieser implementiert ist kannst du natürlich nicht sehen. das steht aber meist in der doku welche man auch lesen sollte. die header schaut man sich im normalfall gar nicht an (und meiner meinung nach haben dort die ivars auch gar nichts verloren)
  • Ja, also das ist mir natürlich klar nur in Swift wird das direkt zur Instanzvariable dazugeschrieben und schaut ca so aus:

    var variable name: type {
    get {
    statements
    }
    set(setter name) {
    statements
    }
    }


    Also ob da was dahinter steht seh ich nicht, ich nehme mal an schon, aber warum steht dann da Default nil, wenn es Default ein empty String ist?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von triplejberger ()

  • Quellcode

    1. if(a = b)
    sollte in swift wie auch in anderen Programmiersprachen gleichermaßen funktionieren und 'YES' bzw. 'true' zurückliefern.
    Du meinst vermutlich eher

    Quellcode

    1. if((a = b) != nil)

    Wobei man das durch Operatorenüberladung natürlich nicht so genau sagen kann…

    Wie dem auch sei: wer definiert Dir denn, dass self.textFieldFirstname.text nil zurück gibt, wenn nichts im Textfeld steht?
    Soweit ich mich entsinne darf self.textFieldFirstname.text = nil überhaupt nicht funktionieren, da ein String zwingend erwartet wird.
    Was ist also näherliegender, als dass Du einen leeren String zurück bekommst?

    Davon ab und von Operatorenüberladung ausgegangen:

    Quellcode

    1. if (a = b){}
    testet auf Gleichheit, genau wie

    Quellcode

    1. if([a isEqualTo:b]){}

    Das heißt, Dein else-Zweig würde immer dann angesprungen, wenn das Textfeld nicht haargenau denselben Wert hat wie firstname.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Marco Feltmann schrieb:

    Quellcode

    1. if(a = b)
    sollte in swift wie auch in anderen Programmiersprachen gleichermaßen funktionieren und 'YES' bzw. 'true' zurückliefern.
    Du meinst vermutlich eher

    Quellcode

    1. if((a = b) != nil)

    Wobei man das durch Operatorenüberladung natürlich nicht so genau sagen kann…

    Wie dem auch sei: wer definiert Dir denn, dass self.textFieldFirstname.text nil zurück gibt, wenn nichts im Textfeld steht?
    Soweit ich mich entsinne darf self.textFieldFirstname.text = nil überhaupt nicht funktionieren, da ein String zwingend erwartet wird.
    Was ist also näherliegender, als dass Du einen leeren String zurück bekommst?

    Davon ab und von Operatorenüberladung ausgegangen:

    Quellcode

    1. if (a = b){}
    testet auf Gleichheit, genau wie

    Quellcode

    1. if([a isEqualTo:b]){}

    Das heißt, Dein else-Zweig würde immer dann angesprungen, wenn das Textfeld nicht haargenau denselben Wert hat wie firstname.


    öm nein, das ist eine zuweisung und kein vergleich ;)
  • joejohannesjoe schrieb:

    Ja, also das ist mir natürlich klar nur in Swift wird das direkt zur Instanzvariable dazugeschrieben und in der "Headerdatei", die es in Swift ja eigentlich nicht gibt schaut das dann ca so aus:

    ​var variable name: type {
    get {
    statements
    }
    set(setter name) {
    statements
    }
    }


    Also ob da was dahinter steht seh ich nicht, ich nehme mal an schon, aber warum steht dann da Default nil, wenn es Default ein empty String ist?


    du sollst ja auch nicht die "nichtexistenten header" lesen sondern die dokumentation!
  • gritsch schrieb:

    öm nein, das ist eine zuweisung und kein vergleich ;)

    Also wenn 'if' eine Zuweisung einleitet, ist die Sprache noch kaputter als ich ursprünglich annahm… ;)

    Wie ist denn in Swing die Verbindung Zuweisung-> If-Abfrage definiert?
    Ich bin ja immer noch der Meinung, dass es einfach nur 'true'/'YES' zurückgibt.

    Quellcode

    1. if let x = 1 {
    2. // Zuweisung erfolgreich
    3. }
    4. else {
    5. // Zuweisung scheiterte
    6. }
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Marco Feltmann schrieb:

    gritsch schrieb:

    öm nein, das ist eine zuweisung und kein vergleich ;)

    Also wenn 'if' eine Zuweisung einleitet, ist die Sprache noch kaputter als ich ursprünglich annahm… ;)

    Wie ist denn in Swing die Verbindung Zuweisung-> If-Abfrage definiert?
    Ich bin ja immer noch der Meinung, dass es einfach nur 'true'/'YES' zurückgibt.

    Quellcode

    1. if let x = 1 {
    2. // Zuweisung erfolgreich
    3. }
    4. else {
    5. // Zuweisung scheiterte
    6. }


    nein, aber das "=".

    und normalerweise (keine ahnung wie es in siwft ist) gibt zb "a = 10" 10. also in a steht 10 und der gesamte ausdruck wird auch als 10 gewertet. egal ob geklammert oder nicht.
    und in swift brauchts bei if-abfragen ja anscheinend keine klammerung (keine ahnung warum - ist meiner meinung nach fürchterlich)
  • joejohannesjoe schrieb:

    1) if let x = optional ist ein versuch eine optional zu entpacken.
    2) Dokumentation steht was anderes als in der "Header Datei" -> This string is @"" by default.
    3) Warum steht dann dort text: String! Was bedeutet dann dieses ! wenn es hier nicht das unwarpping einer optional gemeint ist?


    was im quellcode bei der definition der instanzvariable steht (die du eigentlich gar nicht sehen solltest) ist doch scheiß egal denn das hat rein garnichts mit der implementation des getters zu tun!
  • joejohannesjoe schrieb:

    Ok, ich akzeptiere, dass es hier anscheinend noch inkonsistente Dokumentation gibt.

    Aber wenn der Auruf von .text auf ein TextField mir immer einen Strong retourniert warum steht dann dort ein "!"?


    weil die instanzvariable nur INDIREKT etwas mit dem getter zu tun hat. apple kann da auch die daten ganz woanders herholen. nur weil die instanzvariable den gleichen namen hat wie der getter darf man keine schlüsse ziehen (und nochmal: man schaut in die dokumentation und nicht in den sourcecode wenn man etwas wissen will)