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).
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.
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!