Swift 5.3: Was ist neu?

Hallo Habr! Die Programmiersprache Swift ist aufgrund ihrer Verwendung beim Schreiben von Anwendungen für iOS sehr beliebt, daher ist ihre Entwicklung für alle Beteiligten in diesem Bereich von Interesse.

Mal sehen, was es Neues für Swift-Entwickler der Version 5.3 gibt.

Mehrere nachlaufende Verschlüsse


Die neue Version ( SE-0279 ) bietet eine neue Syntax für endliche Abschlüsse, mit der Sie mehrere Abschlüsse besser lesbar als Funktionsparameter aufrufen können. Dies minimiert die Verwendung zu vieler Klammern in der Funktionssignatur.

import Foundation

func load(url: String, success: (Data) -> Void, failure: (Error) -> Void) {
    
}

// old  version

load(url: "someURL", success: { data in }, failure: { error in })

// new multiple trailing closures

load(url: "someURL") { (data) in
    // do smth
} failure: { (error) in
    // do smth
}

Am Beispiel von 2 Anrufoptionen ist zu sehen, dass die zweite optisch etwas besser aussieht.

Multi-Pattern-Catch-Klauseln


Derzeit kann jede catch-Klausel in einer do-catch-Anweisung nur ein Muster enthalten. Um dieses Problem zu umgehen , verwenden Entwickler die Funktionen von Schalteroptionen, um den Mustervergleich in den Hauptteil der catch-Anweisungen aufzunehmen und dadurch den verschachtelten und duplizierten Code zu erhöhen ( SE-0276 ).

Mit Catch-Elementen kann der Benutzer jetzt eine durch Kommas getrennte Liste von Vorlagen angeben, mit der Variablen wie bei einem Switch an den Catch-Body gebunden werden können.

enum NetworkError: Error {
    case failure, timeout
}

// old  version
func networkCall(){
  do{
    try someNetworkCall()
  } catch NetworkError.timeout{
    print("timeout")
  } catch NetworkError.failure{
    print("failure")
  }
}

// new multi-Pattern catch clauses
func networkCall(){
  do{
    try someNetworkCall()
  } catch NetworkError.failure, NetworkError.timeout {
    print("handle for both")
  }
}

Synthetisierte vergleichbare Konformität für Aufzählungen


Bisher war es keine „angenehme“ Sache, zwei Elemente einer Aufzählung zu vergleichen. Es war notwendig, Comparable anzupassen und eine statische Funktion <zu schreiben, um festzustellen, ob der ursprüngliche Wert kleiner als ein anderer ist.

Mit Swift ( SE-0266 ) können Sie jetzt nicht über die Implementierung all dieser Dinge "schwitzen", und Sie müssen das Protokoll nicht explizit implementieren, solange Ihre Aufzählung dieselben Typen hat. Wenn die entsprechenden Werte nicht angegeben werden, werden die Auflistungen in der semantischen Reihenfolge der Deklaration verglichen.

enum Brightness: Comparable {
    case low(Int)
    case medium
    case high
}

([.high, .low(1), .medium, .low(0)] as [Brightness]).sorted()
// [Brightness.low(0), Brightness.low(1), Brightness.medium, Brightness.high]

Die Anzahl der Selbst kann reduziert werden


Von nun an kann das Selbst an den Stellen weggelassen werden, an denen es nicht mehr benötigt wird ( SE-0269 ). Bisher war die Verwendung von self in Closures erforderlich, wenn Werte aus dem äußeren Bereich erfasst wurden.

struct OldView: View {

    var body: some View {
        Button(action: {
            self.sayHello()
        }) {
            Text("Press")
        }
    }
    
    func sayHello() {}
}

struct NewView: View {

    var body: some View {
        Button {
            sayHello()
        } label: {
            Text("Press")
        }
    }
    
    func sayHello(){}
}

Wo in generischen


In einer neuen Version der Sprache ( SE-0267 ) wurde die Möglichkeit eingeführt, Funktionen in generischen Typen und Erweiterungen anzuhängen.

struct Stack<Element> {
    private var array = [Element]()

    mutating func push(_ obj: Element) {
        array.append(obj)
    }

    mutating func pop(_ obj: Element) -> Element? {
        array.popLast()
    }
}

extension Stack {
    func sorted() -> [Element] where Element: Comparable {
        array.sorted()
    }
}

Sie können dem Stapel eine neue sortierte () Methode hinzufügen, jedoch nur in den Fällen, in denen die Elemente im Stapel mit Comparable übereinstimmen.

Neuer Typ Float16


Einführung des Float16-Gleitkommas mit halber Genauigkeit ( SE-0277 ). Mit dem Aufkommen des maschinellen Lernens auf Mobilgeräten in den letzten Jahren zeigt dies nur die Ambitionen von Apple, dieses Thema zu fördern. Float 16 wird üblicherweise auf mobilen GPUs für die Datenverarbeitung und als komprimiertes Format für Skalen in ML-Anwendungen verwendet.

let f16: Float16 = 7.29

Swift 5.3 hat viele Verbesserungen am Swift Package Manager (SPM) eingeführt. Betrachten Sie sie.

  1. Mit SE-0271 (Package Manager-Ressourcen) kann SPM Ressourcen wie Bilder, Audio, JSON und mehr enthalten.
  2. Mit SE-0272 (Package Manager Binary Dependencies) kann SPM Binärpakete zusammen mit der vorhandenen Unterstützung von Quellpaketen verwenden. Dies bedeutet, dass gemeinsam genutzte Closed-Source-SDKs wie Firebase jetzt mithilfe von SPM integriert werden können.
  3. Mit SE-0273 (Package Manager Conditional Target Dependencies) können Sie Ziele so konfigurieren, dass sie nur für bestimmte Plattformen und Konfigurationen Abhängigkeiten aufweisen. Beispielsweise können Sie beim Kompilieren für Linux spezielle zusätzliche Frameworks festlegen.
  4. Mit SE-0278 können Sie lokalisierte Ressourcen hinzufügen.

Somit kann festgestellt werden, dass Version 5.3 einige gute Innovationen eingeführt hat, die im Laufe der Zeit von den Entwicklern aufgegriffen werden.

All Articles