Nouvelles fonctionnalités de Swift 5.9

Swift 5.9 est intégré à Xcode 15. Bien qu'il s'agisse de la dernière version majeure de Swift 5, il ajoute encore de nombreuses nouvelles fonctionnalités.

expressions if et switch

ifLes instructions ET switchpeuvent être utilisées comme expressions.

let score = 90
let result1 = if score >= 60 {
    "及格"
} else {
    "不及格"
}
print(result1)

let result2 = switch score {
case 0 ..< 60:
    "不及格"
case 60 ..< 70:
    "及格"
case 70 ..< 80:
    "中等"
case 89 ..< 90:
    "良好"
case 90 ... 100:
    "优秀"
default:
    "其他"
}
print(result2)

~Copyable ne peut pas être copié

  • Introduction du concept "d'énumérations et de structures non copiables".
  • Les énumérations et les structures non copiables doivent respecter ~Copyablele protocole.
  • Si les énumérations et les structures sont conformes au ~Copyableprotocole, elles Sendablene peuvent plus être conformes à aucun autre protocole que le protocole.
struct Person: ~Copyable {
    var name = "Zhangsan"
    var age = 10
    let sex = "male"
}

let person = Person()
print(person.name, person.age, person.sex)

// 报错:Cannot consume noncopyable stored property 'person' that is global
let personCopy = person
print(personCopy.name, personCopy.age, personCopy.sex)

L'horloge ajoute la méthode sleep(for:)

let clock1 = ContinuousClock()
try? await clock1.sleep(for: .seconds(1))
let clock2 = SuspendingClock()
try? await clock2.sleep(for: .seconds(1))

// 应用于Concurrency
Task {
    print("start task...")

    // Swift5.7之后,Swift5.9之前
    try await Task.sleep(until: .now + .seconds(1), clock: .suspending)
    // Swift5.9之后
    try await Task.sleep(for: .seconds(1), clock: .suspending)

    print("continue task...")
}

// 异步函数
func doSomeAsyncWork() async throws {
    print("start to work...")
    // Swift5.7之后,Swift5.9之前
    try await Task.sleep(until: .now + .seconds(3), clock: .continuous)
    // Swift5.9之后
    try await Task.sleep(for: .seconds(3), clock: .continuous)

    print("continue to work...")
}

Macros

introduire

  • Swift 5.9 introduit une nouvelle fonctionnalité importante : les macros.
  • Les macros peuvent manipuler dynamiquement le code avant la compilation, permettant l'injection de fonctionnalités supplémentaires au moment de la compilation.

Classification

  • Macro autonome : @freestandingdéclarée par des mots-clés, commence par une étiquette lorsqu'elle est utilisée et ajoute les paramètres correspondants dans #la suite , la fonction principale est de remplacer le contenu dans le code.()
  • Macro supplémentaire : Déclarez via @attacheddes mots-clés, commencez par une étiquette lorsqu'elle est utilisée et ajoutez les paramètres correspondants dans @ce qui suit , la fonction principale est d'ajouter du code pour la déclaration.()

Étapes d'utilisation

  1. Chaque macro est un package, vous devez donc créer un package de macro via le menu Xcode —> File —> New —> Package... —> Swift Macro .
  2. Sources: Le répertoire source contient 3 sous-dossiers.
    • [Macro name]: Contient les fichiers source de déclaration pour la création de macros.
    • [Macro name]Client: contient les fichiers source utilisés pour créer la macro.
    • [Macro name]Macros: contient les fichiers source d'implémentation pour la création d'une macro.
  3. Lorsque la macro est utilisée, le code développé peut être affiché ci-dessous en sélectionnant la macro —> menu contextuel —> Développer la macro .
// 声明源文件 [Macro name].swift
// 定义一个宏函数,接收一个泛型参数,返回原始值与对应字符串组成的元组,函数实现在FirstMacroMacros的StringifyMacro
@freestanding(expression)
public macro stringify<T>(_ value: T) -> (T, String) = #externalMacro(module: "FirstMacroMacros",
                                                                      type: "StringifyMacro")

// 实现源文件 [Macro name]Macro.swift
public struct StringifyMacro: ExpressionMacro {
    public static func expansion(
        of node: some FreestandingMacroExpansionSyntax,
        in context: some MacroExpansionContext
    ) -> ExprSyntax {
        guard let argument = node.argumentList.first?.expression else {
            fatalError("compiler bug: the macro does not have any arguments")
        }

        return "(\(argument), \(literal: argument.description))"
    }
}
// 导出Macro以供使用
@main
struct FirstMacroPlugin: CompilerPlugin {
    let providingMacros: [Macro.Type] = [
        StringifyMacro.self,
    ]
}


// 使用源文件 main.swift
import FirstMacro

let a = 10
let b = 20
let (result, code) = #stringify(a + b)
print("The value \(result) was produced by the code \"\(code)\"")

Je suppose que tu aimes

Origine juejin.im/post/7261604498925223973
conseillé
Classement