
Neue Beta-Codes für Xcode, macOS Mojave und iOS wurden veröffentlicht - und hier sind die wichtigsten Punkte, die ich gelernt habe.
Swift 5 für Xcode 10.2 Beta
Schnell
Zunächst wird die neueste Beta-Version von Xcode mit der neuen Version von Swift geliefert:
Apple Swift 5.0 (swiftlang-1001.0.45.7 clang-1001.0.37.7)
Target: x86_64-apple-darwin18.2.0
ABI version: 0.6
Beginnen wir mit den aufregendsten Neuigkeiten:
Swift-Anwendungen enthalten keine DLLs mehr für die Swift-Standardbibliothek und das Swift SDK-Overlay in Versionen für iOS 12.2-, watchOS 5.2- und tvOS 12.2-Geräte. Infolgedessen werden Swift-Anwendungen verkleinert, wenn sie zum Testen in TestFlight bereitgestellt werden oder wenn ein Archiv für eine Distribution komprimiert wird.
ABI wird endlich stabil, und das sind großartige Neuigkeiten. Meiner Meinung nach ist dies heute eines der Hauptprobleme von Swift - nicht wegen Nebenwirkungen, sondern wegen unerfüllter Versprechen. Einige meiner Freunde haben sogar Erweiterungen für Apple Watch auf Objective-C neu geschrieben, um die Größe der Binärdatei zu verringern (von ca. 15 MB auf 1 MB). Weitere Informationen zum ABI-Status finden Sie unter den folgenden Links:
Swift ABI Dashboard und Swift ABI Manifesto of Stability .
Mit dem Attribut @dynamicCallable können Sie benannte Typen wie Funktionen mit einfachem syntaktischem Zucker aufrufen. Der Hauptzweck besteht darin, die Kompatibilität mit dynamischen Sprachen sicherzustellen. ( SE-0216 )
Ein Beispiel:
@dynamicCallable struct ToyCallable { func dynamicallyCall(withArguments: [Int]) {} func dynamicallyCall(withKeywordArguments: KeyValuePairs<String, Int>) {} } let x = ToyCallable() x(1, 2, 3) // Desugars to `x.dynamicallyCall(withArguments: [1, 2, 3])` x(label: 1, 2) // Desugars to `x.dynamicallyCall(withKeywordArguments: ["label": 1, "": 2])
Dieses Thema ist ziemlich umfangreich und die Innovation macht mir gemischte Gefühle. Paul Hudson konnte im Artikel „
Was ist neu in Swift 5.0? “ Aus einer neutralen Perspektive darüber sprechen.
Der Swift 3-Kompatibilitätsmodus ist ausgeschlossen. Die unterstützten Werte für das -swift-version
sind 4, 4.2 und 5.
Die Ära geht zu Ende: Die Kompatibilität auf Quellenebene mit Swift 3 ist nicht mehr vorhanden. Dieser Schritt wurde erwartet, wurde in der Swift 5 Roadmap angekündigt und doch. Ich empfehle dringend, Ihr Gedächtnis zu aktualisieren, indem Sie den
Swift 5.0 Release-Prozess lesen. Swift 5 ist da - mach dich bereit.
Im Swift 5-Modus müssen switch-Anweisungen für in Objective-C deklarierte oder aus Systemframeworks stammende Enumerationen unbekannte Werte verarbeiten, dh solche, die möglicherweise in Zukunft hinzugefügt oder in der Objective-C-Implementierungsdatei separat definiert werden.
Formal können Sie mit Objective-C einen beliebigen Wert in die Aufzählung aufnehmen, wenn er dem Basistyp entspricht. Diese unbekannten Fälle können von der neuen @unknown default
case @unknown default
@ @unknown default
, die immer noch eine Warnung @unknown default
, wenn bekannte Fälle im Switch übersehen werden. Sie können auch mit der üblichen default
gesteuert werden. Wenn Sie in Objective-C eine Aufzählung angegeben haben und nicht möchten, dass Clients unbekannte Werte verarbeiten müssen, verwenden Sie das Makro NS_CLOSED_ENUM
anstelle von NS_ENUM
. Der Swift-Compiler erkennt dies und muss in der switch-Anweisung keine default
angeben.
In den Modi Swift 4 und 4.2 können Sie auch die @unknown default
. Wenn dies nicht getan wird und ein unbekannter Wert in der Umschaltung fehlt, wird das Programm unterbrochen - genau wie in Swift 4.2 und Xcode 10.1 ( SE-0192 ).
Dies ist ein seit langem bestehendes Problem, das immer noch zu Unannehmlichkeiten führt, insbesondere wenn Sie keine
default
in den Schaltern festlegen möchten. Ich erinnere mich, wie viel Qual ich von der
.provisional
Option erhalten habe
.provisional
die in iOS 12 im Typ
UNAuthorizationOptions
. Mit der Einführung eines
unknown
Falls ist der Umgang mit solchen Situationen jetzt viel einfacher geworden.
Schneller Paketmanager
Jetzt können Pakete die erforderliche Mindestversion für die Apple-Plattform (macOS, iOS) auswählen, wenn sie die Konfigurationsdatei Package.swift aus Swift 5 verwenden. Die Zusammenstellung von Paketen ist nicht möglich, wenn mindestens eine der Abhängigkeiten eine Mindestversion der Plattform aufweist, die größer ist als die für das Paket selbst angegebene Version. ( SE-0236 )
Meiner Meinung nach sind dies die wichtigsten Neuigkeiten in Bezug auf SPM. Tatsächlich kann diese Funktion viele Probleme lösen, die verhindern, dass SPM in der iOS-Welt nützlich wird. In meinem
letzten Artikel habe ich versucht, den aktuellen Status von SPM im Kontext der iOS-Entwicklung zu analysieren. Es scheint, dass ich jetzt die Schlussfolgerungen überprüfen muss.
Aber es gibt Probleme:
- Einige Projekte zeigen eine Regression der Kompilierungszeit im Vergleich zu früheren Versionen.
- Projekte für die Befehlszeile stürzen beim Start ab und
dyld: Library not loaded
Fehler dyld: Library not loaded
(Bibliothek nicht geladen). Krücke: SWIFT_FORCE_STATIC_LINK_STDLIB=YES
benutzerdefinierten Assembly-Build SWIFT_FORCE_STATIC_LINK_STDLIB=YES
.
Das
Änderungsprotokoll enthält eine Reihe behobener Fehler und andere Informationen zu Swift 5, die für Ihre Branche möglicherweise wichtig sind. Probieren Sie sie aus: Sie können sich dafür entscheiden, geerbte, festgelegte Initialisierer mit einer variablen Anzahl von Argumenten zu verwenden. Oder Sie haben ein Deadlock-Problem aufgrund komplexer rekursiver Typdefinitionen mit Klassen und Generika. Oder generische Aliase in der
@objc
Methode verursachen Unannehmlichkeiten.
Xcode 10.2 Beta
Clang Compiler
Es gibt viele neue Warnungen für den Clang-Compiler, und die meisten beziehen sich auf Frameworks und Module. Diese Tatsache ist sehr interessant, da sie (
vermutlich ) von der Integration von Swift Package Manager als Tool für das Abhängigkeitsmanagement spricht. Hier meiner Meinung nach die wichtigsten Punkte:
- Neue Diagnosen identifizieren Framework-Header, die Anführungszeichen anstelle von Einschlüssen im Framework-Stil verwenden. Standardmäßig ist die Benachrichtigung
-Wquoted-include-in-framework-header
Sie können sie jedoch aktivieren, indem Sie die clang
Option -Wquoted-include-in-framework-header
.
- Offene Header des Frameworks führen möglicherweise fälschlicherweise
#import
oder #include
geschlossene Header aus, was zu strukturellen Störungen und manchmal zum zyklischen Import von Modulen führt. Solche Verstöße werden durch eine neue Diagnose gemeldet. Es ist standardmäßig in clang
deaktiviert und wird durch das -Wframework-include-private-from-public
gesteuert.
- Die Verwendung von
@import
in den Headern des Frameworks @import
, dass sie ohne Module verwendet werden. Neue Diagnosen suchen in den Headern nach @import
wenn das Flag —fmodules
wird. Standardmäßig ist es deaktiviert und wird durch das -Watimport-in-framework-header
gesteuert.
- Zuvor hatte der Verlust des
framework
Schlüsselworts beim Deklarieren eines Moduls für das Framework die Kompilierung nicht beeinträchtigt, führte jedoch stillschweigend zum falschen Ergebnis. Neue Diagnose -Wincomplete-framework-module-declaration
und ein neuer Fix bieten Ihnen die -Wincomplete-framework-module-declaration
, den gewünschten Schlüssel hinzuzufügen. Diese Warnung wird automatisch ausgelöst, wenn clang
—fmodules
Flag —fmodules
.
Zunächst einmal: Wie schalte ich sie ein? Gehen Sie zum Menü "
Build-Einstellungen" für Ihr Projekt, wählen Sie das Element "
Apple Clang - Benutzerdefinierte Compiler-Flags" und setzen Sie das gewünschte Flag unter "
Andere C-Flags" .

Ich habe versucht, eine alte Objective-C-Anwendung zu erstellen, und habe in den offenen Headern des Frameworks viele Probleme mit privaten Headern festgestellt:

Es gab auch Probleme mit Anführungszeichen für den Import innerhalb des Frameworks:

Ich rate Ihnen, eine ähnliche Diagnose zu stellen oder zumindest eine Notiz für die Zukunft zu machen. Sobald diese Probleme viel Ärger verursachen können.
System erstellen
Es gibt auch ein schönes Update für das Code-Build-System.
Die Suche nach impliziten Abhängigkeiten funktioniert jetzt auch im Abschnitt "Andere Linker-Flags" verwandter Frameworks und Bibliotheken, die mit -framework, -weak_framework, -reexport_framework, -lazy_framework, -weak-l, -reexport-l, -lazy-l —l.
Diese Innovation ist auch sehr faszinierend. Im Wesentlichen bedeutet dies, dass Sie jetzt implizite Abhängigkeiten mit der
xcodebuild
.xcconfig
oder sogar
xcodebuild
, wobei die Link / Embed-Phasen in Xcode selbst vermieden werden.
Debuggen
Debugger-Innovationen:
UIStackView
Eigenschaften UIStackView
jetzt im visuellen Debugger-Inspektor angezeigt. Der visuelle Debugger sieht kompakter dreidimensional aus.

Im Falle eines Fehlers aufgrund von Speichermangel kann Xcode jetzt automatisch ein Diagramm der Speichernutzung erstellen. Sie können die Erstellung von Diagrammen im Diagnosefenster in den Einstellungen für die Ausführung des Schemas aktivieren.
Wenn Sie sich in iOS und watchOS dem Speicherbedarfslimit nähern, zeigt Xcode das Speicherlimit im Speicherauslastungsbericht an.

Sehen Sie die rote Linie? Wenn es erreicht ist, erhält Watchdog eine BenachrichtigungsanwendungDidReceiveMemoryWarning. Ich dachte, das Update wäre nützlicher, aber im Moment ist es nur ein kleines Plus.
LLDB-Debugger
Neue Brötchen erschienen in LLDB:
- Jetzt können Sie $ 0, $ 1 und andere Abkürzungen verwenden, wenn Sie Ausdrücke in Closures auswerten.
- LLDB hat jetzt einen neuen Alias
v
für den Befehl Frame Variable, mit dem Variablen im aktuellen Frame Stack angezeigt werden. Da dies nicht das Werkzeug zum Auswerten von Ausdrücken beinhaltet, kann v
viel schneller als p
oder po
und ist daher vorzuziehen.
Ich habe keine Leistungsverbesserung festgestellt, aber in einigen Fällen bietet
v
eine bessere Ausgabe - aber es ist kein direkter Ersatz für
po
und funktioniert nur mit dem aktuellen Frame-Stack mit bestimmten Einschränkungen. Beispiele:

Spielplätze
Mein Lieblingsabschnitt! Beginnen wir mit den Fehlern:
Die Spielplatz-App wird möglicherweise nicht gestartet
Leider gab es in der neuen Beta keine weiteren Neuigkeiten zu Playgrounds.
Simulator
Ein paar Worte zum Simulator:
Siri funktioniert nicht in watchOS- und iOS-Simulatoren.
Die Pasteboard-Synchronisation zwischen macOS und simulierten iOS-Geräten ist zuverlässiger geworden.
Ich hoffe das ist wahr.
Die Mikrofonzugriffsanforderung auf allen simulierten Geräten wird nicht wiederholt.
Dies sind gute Nachrichten, da viele Leute aufgrund dieses Problems Schwierigkeiten mit CI und Build-Agenten hatten. Jetzt können Sie eine Krücke bauen oder zumindest Ihre Anleitungen zur Arbeit mit Montageagenten ergänzen, indem Sie die Option „Simulator einmal ausführen“ hinzufügen.
Testen
xccov
unterstützt die Kombination mehrerer Codeabdeckungsberichte (und verwandter Archive) zu einem gemeinsamen Bericht und Archiv. Der resultierende Bericht kann Ungenauigkeiten enthalten, da zwischen den Momenten der Berichterstellung Änderungen in den Quelldateien auftreten können. Wenn keine Änderungen vorgenommen wurden, ist der Bericht korrekt.
xccov
spiegelt nun den Unterschied zwischen den verschiedenen Xcode-Abdeckungsberichten wider, mit denen Abdeckungsänderungen berechnet werden können. Um beispielsweise den Unterschied zwischen before.xccovreport
und after.xccovreport
, rufen Sie den Befehl xccov
wie folgt auf: xccov diff --json before.xccovreport after.xccovreport
.
- Statische Bibliotheks- und Framework-Ziele werden jetzt im Abdeckungsbericht in Form von Einträgen der obersten Ebene angezeigt. Für alle Ziele, die eine statische Bibliothek oder ein statisches Framework enthalten, werden Diagramme von Abdeckungsindikatoren gesammelt. Dies löst auch das Problem, wenn die Quelldateien einer statischen Bibliothek oder eines Framework-Ziels in den Bericht eingegeben werden, selbst wenn das Ziel selbst aus der Codeabdeckung im Diagramm entfernt wird.
Gute Nachrichten für die kontinuierliche Integration, insbesondere eine Demonstration des Unterschieds. Informieren Sie Ihre Release-Ingenieure oder diejenigen, die ähnliche Dinge tun.
Es gibt jedoch mehrere Einschränkungen hinsichtlich der Parallelisierung von Tests:
- Die Aufzeichnung auf Klonen funktioniert nicht, wenn die Parallelisierung aktiviert ist.
- Die Projektprofilerstellung aus Xcode verhält sich bei aktivierter Testparallelisierung falsch.
Der Rest ist mit der Korrektur einiger Fehler zufrieden:
Wenn der Test aufgrund des Absturzes des Testläufers beim Start fehlschlägt, versucht Xcode, eine detaillierte Meldung zu generieren, die den Fehler beschreibt. Sie können diesen Fehler im Testprotokoll untersuchen. Wenn Sie xcodebuild
, wird er auch in stdout
xcodebuild
. Es ist auch in den strukturierten Protokollen des resultierenden Pakets enthalten.
Wir haben oft ähnliche Probleme - und wir sind ratlos darüber, was passiert ist. Manchmal ist das falsche Layout, manchmal die Systemüberlastung. Jetzt wird die Zuverlässigkeit der Anwendung erhöht.
In den während des Tests gesammelten Absturzberichten gehen wichtige Abschnitte wie der Grund für den Absturz oder die Beschreibung nicht mehr verloren.
Kein Kommentar hier, pure Freude.
Die neuesten Nachrichten, die für viele Entwickler nützlich sind: Xcode unterstützt jetzt den
MacOS-Content-Caching-Dienst . Dies bedeutet, dass Sie mit einen Caching-Server im lokalen Netzwerk erstellen können, was Zeit und Geld spart, wenn Sie neue und alte Versionen von Xcode im lokalen Netzwerk herunterladen.
Die Probleme
In dieser Beta bin ich auf mehrere Probleme gestoßen. Sie betrafen hauptsächlich Tools von Drittentwicklern.
carthage
generiert beispielsweise den Fehler "Es wurden keine verfügbaren Simulatoren für iOS gefunden."
Ich habe den verfügbaren Simulator überprüft und es scheint, dass der Beta-Fehler schuld ist. Außerdem ist das Herunterladen anderer Laufzeiten von Xcode nicht verfügbar - die Liste der verfügbaren Simulatoren ist leer:
$ xcrun simctl list devices --json | grep -A16 12.1 "com.apple.CoreSimulator.SimRuntime.iOS-12-1" : [ { "availability" : "(unavailable, runtime profile not found)", "state" : "Shutdown", "isAvailable" : false, "name" : "iPhone 5s", "udid" : "DDD36346-A76F-42E8-80F4-6F11E1EE4BEB", "availabilityError" : "runtime profile not found" }, { "availability" : "(unavailable, runtime profile not found)", "state" : "Shutdown", "isAvailable" : false, "name" : "iPhone 6", "udid" : "21794717-BC89-45E4-9F57-8CF9D14A87D1", "availabilityError" : "runtime profile not found" }, --
Dies ist jedoch nur eine Beta-Version, und die Liste der Änderungen ist riesig. Wir werden geduldig sein. Karthago untersucht bereits die Situation, alle Vermutungen sind in diesem
Fehler umrissen.
iOS 12.2 Beta
So so. Es scheint, dass Apple damit beschäftigt ist, technische Schulden zu polieren und Sicherheitspatches anzuwenden. Es gibt also keine ernsthaften Neuigkeiten, aber es gibt zwei Probleme:
- Es besteht die Möglichkeit, dass Sie sich nach Auswahl einer Karte nicht bei Wallet authentifizieren können.
- Es besteht die Möglichkeit, dass Sie keinen Prepaid-Tarif über das Mobilfunknetz erwerben können.
Und Apple News ist jetzt in Kanada erhältlich.
Nicht wechseln.
macOS Mojave 10.14.4 Beta
Das einzige Update hier ist ein mögliches Problem mit Safari 12.1 nach dem Upgrade von Safari 10.1.2.
Nach dem Upgrade von Safari 10.1.2 auf Safari 12.1 werden Webseiten möglicherweise nicht richtig angezeigt. (47335741)
Problemumgehung:
defaults delete com.apple.Safari
die
defaults delete com.apple.Safari
für
defaults delete com.apple.Safari
im Terminal ein. Bitte beachten Sie, dass Sie dadurch alle vorherigen Safari-Einstellungen verlieren.
Abschließend
Der Artikel erschien viel größer als ich erwartet hatte. Sie finden alle meine Ergebnisse oben. Und kurz gesagt - Swift 5 ist gekommen!
Vielen Dank für Ihre Aufmerksamkeit.