Programmieren mit Swift - Für macOS und iOS
Programmieren mit Swift - Für macOS und iOS
Eigene NSFormatter, Teil 2

Um der Funktionsweise unserer Formatter-Klasse auf die Spur zu kommen, sollten wir uns den Wert des Parameters partialString der isPartialStringValid-Methode näher ansehen. Eine println-Anweisung genügt, um den Wert auf der Konsole der Entwicklungsumgebung auszugeben.
override func isPartialStringValid(partialString: String, newEditingString newString:
     AutoreleasingUnsafeMutablePointer,
     errorDescription error: AutoreleasingUnsafeMutablePointer) -> Bool
{
    println(partialString)
    newString.memory = partialString.uppercaseString
    return false
}
stacks_image_1F868887-238F-4F5A-8B08-E30031264970
Wie Sie sehen, enthält partialString immer den aktuell im Textfeld enthaltenen Text, plus das zuletzt eingegebene Zeichen. Man erhält einen guten Überblick, was in dem Textfeld steht und was eingegeben wurde. Wie aber kann man sicherstellen, dass nur Zahlen eingegeben werden können? Es ist notwendig, partialString zu vergleichen, dass aber gestaltet sich schwierig. Gibt man zum Beispiel die Zahlenfolge 1, 2 und 3 ein, so ist partialString beim ersten Aufruf 1, beim zweiten Aufruf 12 und beim letzten Aufruf 123. Dies mit if oder switch Strukturen zu vergleichen, ist nahezu unmöglich. Viel sinnvoller wäre es zu ermitteln, ob das eingegebene Zeichen eine Zahl ist, oder genauer, ob es sich in der Gruppe der Zeichen befindet, die Zahlen repräsentieren.
Eine Gruppe von Zeichen kann in Swift durch NSCharacterSet abgebildet werden und wir benötigen in der der isPartialStringValid-Methode ein NSCharacterSet, das alle unzulässigen Zeichen enthält. Glücklicherweise haben die Entwickler von Apple erneut einen Großteil der Arbeit für uns erlegt, denn durch den Aufruf von NSCharacterSet.decimalDigitCharacterSet() erhalten wir ein NSCharacterSet mit sämtlichen Zahlen. Ein zusätzlicher Aufruf von invertedSet kehrt die Auswahl um, sodass wir hier ein Set bekommen, das keine Zahlen enthält. Das war einfach!
var nonNumbers = NSCharacterSet.decimalDigitCharacterSet().invertedSet;
Will man partialString mit dem Set der nicht zulässigen Zeichen vergleichen, muss man das nicht für jedes Zeichen einzeln tun. rangeOfCharacterFromSet erledigt das für Sie. Erhält die Range einen ungültigen Wert, wurde ein Zeichen aus dem NSCharacterSet gefunden und die Methode muss false zurückgeben. Ist range nil wurde keines der ungewünschten Zeichen entdeckt und die Methode darf mit true verlassen werden. Ein alternativer Text wird newString jetzt nicht mehr zugewiesen. Im Fall eines ungültigen Zeichens wird dieses einfach ignoriert.
override func isPartialStringValid(partialString: String, newEditingString newString:
AutoreleasingUnsafeMutablePointer,
errorDescription error: AutoreleasingUnsafeMutablePointer) -> Bool
{
    var nonNumbers = NSCharacterSet.decimalDigitCharacterSet().invertedSet;

    if let range = partialString.rangeOfCharacterFromSet(nonNumbers)
    {
        return false
    }
        return true
}
Testen Sie das Programm! Wenn alles zu Ihrer Zufriedenheit funktioniert, sollten sie den Formatter auch den anderen Eingabefelden zuweisen.
func applicationDidFinishLaunching(aNotification: NSNotification)
{
    var formatter = InputFormatter()
    self.inputDegree.formatter = formatter
    self.inputMinutes.formatter = formatter
    self.inputSeconds.formatter = formatter
}
Mit der Erweiterung ist unser GeoConverter viel professioneller geworden und wir haben sogar einen NSFormatter entwickelt, den wird in zukünftigen Anwendungen erneut verwenden können. Die Möglichkeiten eines NSFormatter sind damit aber keineswegs erschöpft. Einen anderen Anwendungsfall werden Sie noch kennenlernen.

nächste Seite