Errata zum Buch »Swift 5 — Das umfassende Handbuch«

Diese Seite enthält Updates und Errata zum Buch »Swift 5 — Das umfassende Handbuch«.

Errata

S. 25 Autom. Ausführung von Code in Playgrounds

Playgrounds werden nur dann automatisch ausgeführt, wenn der Modus Automatically Run aktiv ist (siehe die folgende Abbildung).

Playgrounds wahlweise automatisch oder nur bei expliziter Aufforderung ausführen
S. 42, mehrzeilige Anweisungen

Die Methode heißt appendingPathComponent, nicht stringByAppendingPathComponent. (In den Beispieldateien ist er Code korrekt.)

S. 50, Dictionary-Beispiel

Die Variable hex sollte besser mit let statt mit var deklariert werden.

S. 70, Operatoren

Der Kommentar zum Beispiel für die Mehrfachzuweisung ist falsch. Richtig muss der Kommentar so lauten:

let (_, a, (b, c)) = (1, 2, ("x", "y"))
// entspricht let a=2; let b="x"; let c="y"
S. 73, Bit-Shift-Operatoren

Auf S. 73 erwähne ich den Operator >>>. Diesen gibt es in Swift aber gar nicht (wohl aber in Java). Ideen, wie Sie einen derartigen Operator in Swift implementieren können, finden Sie auf Stackoverflow:

https://stackoverflow.com/questions/41202147

S. 79, Ranges

Die interne Darstellung von a...b und a..<b hat sich geändert. Jetzt gilt:

1..<10  // entspricht Range(uncheckedBounds: (1, 10))
1...10  // entspricht ClosedRange(uncheckedBounds: (1, 10)
S. 96, print bei Optionals

Aktuelle Swift-Versionen sind bei Optionals nicht mehr so pingelig wie in Swift 5.0. Daher funktioniert

var op2: Double!   // Optional für Double (Implicitly Unwrapped 
                   //                      Optional)
print(op2 as Any)  // Ausgabe: nil

jetzt ohne Fehlermeldung.

S. 180/181, Vergleich von Unicode-Zeichenketten

Die Default-Sortierordnung von Zeichenketten hat sich geändert. Swift verwendet nicht mehr die Unicode-Normalform D. Vielmehr gilt jetzt:

"ä" < "b"                 // false

var ar = ["A", "B", "C", "ä", "ö", "ü", "s", "t", "ß", "a", "z"]
ar.sort(by: <)
print(ar)
// ["A", "B", "C", "a", "s", "t", "z", "ß", "ä", "ö", "ü"]

D.h., deutsche Sonderzeichen werden nach a-z eingeordnet. Wenn Sie eine bestimmte länderspezifische Sortierung wünschen, müssen Sie diese explizit durch ein Locale-Objekt angeben (wie auf S. 181 beschrieben).

S. 397, Free Provisioning

Free Provisioning ist leider mit noch einer erheblichen Einschränkung verbunden: Die dabei erzeugten Profiles sind nur sieben Tage lang gültig. Danach funktionieren die auf Ihr iPhone oder iPad übertragenen Apps nicht mehr und stürzen beim Start ab.

S. 409 ios-viewcontroller-lifecycle-Beispiel

Die Beispiel-App stürzt ab, sobald Sie auf den ‚Weiter‘-Button klicken. Der Grund ist ein verändertes Verhalten in iOS 13, das die im Programm eingestellten Segue-Attribute nicht mehr zulässt. Abhilfe: Klicken sie in Main.storyboard auf den Segue-Verbindungspfeil, und stellen Sie dann im Attributinspektor

Transition = Partial Curl

auf

Transition = Same As Destination

Quelle/Hintergrund: https://stackoverflow.com/questions/61451971

S. 455 ff (Erscheinungsbild von Segues bzw. des Presentation Controllers)

Mit iOS 13 hat sich das Erscheinungsbild von Apps geändert, wenn Sie mit Segues von einer View in eine andere wechseln. Die vorige View rückt in den Hintergrund, ein winziger Ausschnitt bleibt am oberen Bildschirmrand sichtbar. Das neue Design ist auch im Storyboard in Xcode sichtbar, weswegen die Screenshots im Buch ein wenig anders aussehen als in aktuellen Xcode-Versionen.

In iOS 13 werden durch Segues verbundene Views ein wenig moderner dargestellt

Das neue Verhalten ist z.B. in diesem Artikel auf medium.com ausführlich dokumentiert. stackoverflow zeigt, wie sich bei Bedarf das alte Erscheinungsbild erzwingen lässt. Siehe auch

https://developer.apple.com/videos/play/wwdc2019/103
https://developer.apple.com/videos/play/wwdc2019/224
https://developer.apple.com/videos/play/wwdc2019/808

S. 487, Popup-Dialoge

Der im Buch abgedruckte Code entspricht nicht dem (korrekten) Code der Beispieldatei. Die prepare-Methode in ViewController.swift sollte so aussehen:

// wird ausgeführt, bevor der Info-Popup-Dialog angezeigt wird
  override func prepare(for segue: UIStoryboardSegue,
                        sender: Any?)
  {
    if let dest = segue.destination as? PopupViewController,
       let popPC = dest.popoverPresentationController,
       let btn = sender as? UIButton
    {
      // steuert die erlaubte Richtung des Pfeils
      // popPC.permittedArrowDirections = [.up, .left]
      popPC.permittedArrowDirections = [.up]
      popPC.sourceRect = btn.bounds
      popPC.delegate = self
    }
  }
S. 519/520, Splitter -> Stepper

Auf den Seiten 519 und 520 schreibe ich mehrfach von einem Splitter-Steuerelement bzw. der dazugehörigen NSSplitter-Klasse. Gemeint ist in allen Fällen das Stepper-Steuerelement bzw. die NSStepper-Klasse, die ich dann im Code auch tatsächlich verwende.

S. 640, Zweites NSTableView-Beispiel (Beispielcode-Verzeichnis 23/macos-table)

Die vier Variablen der Klasse Country müssen mit dem Attribut @objc deklariert werden, also:

class Country : NSObject {
  @objc var name: String
  @objc var population: Int
  @objc var area: Double
  @objc var capital: String
  ...

Alternativ kann die ganze Klasse mit dem Attribut @objcMembers deklariert werden.

Der Grund: NSTableView kann die Zeilen der Tabelle nur sortieren, wenn die zugeordnet Objekte Key Value Coding-Compliant sind.

Hintergründe: https://stackoverflow.com/questions/44762460, KeyValueCoding in der Apple-Dokumentation

S. 945, App-Store-Artwork für tvOS

Anders als im Buch beschrieben darf das App Icon – App Store (in alten Projekten App Icon – Large) nur in einfacher Auflösung (1x) eingefügt werden, also mit exakt 1280×768 Pixel.

Das App Icon (ehemals App Icon – Small) muss weiterhin in 1x- und 2x-Varianten zur Verfügung gestellt werden, also mit 400×240 Pixel sowie mit 800×480 Pixel.

Siehe auch https://stackoverflow.com/questions/46515644.

S. 1218, Temporäre Verzeichnisse

Die Methode heißt appendingPathComponent, nicht stringByAppendingPathComponent. (In den Beispieldateien sowie im Listing auf S. 1219 ist er Code korrekt.)


Letzte Änderung 16.11.2021

Vielen Dank an alle Leser, die mir Feedback geben!