Nuevas características en Swift 5.9

Swift 5.9 está integrado en Xcode 15. Aunque es la última versión principal de Swift 5, aún agrega muchas características nuevas.

si y cambiar expresiones

ifLas declaraciones AND switchse pueden usar como expresiones.

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 no se puede copiar

  • Introdujo el concepto de "enumeraciones y estructuras no copiables".
  • Las enumeraciones y estructuras no copiables deben cumplir con ~Copyableel protocolo.
  • Si las enumeraciones y las estructuras se ajustan al ~Copyableprotocolo, Sendableya no pueden ajustarse a ningún otro protocolo excepto al protocolo.
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)

Clock agrega el método 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

introducir

  • Swift 5.9 presenta una nueva característica importante: las macros.
  • Las macros pueden manipular dinámicamente el código antes de la compilación, lo que permite la inyección de funcionalidad adicional en el momento de la compilación.

Clasificación

  • Macro independiente: @freestandingdeclarada por palabras clave, comienza con una etiqueta cuando se usa y agrega los parámetros correspondientes a #continuación , la función principal es reemplazar el contenido en el código.()
  • Macro adicional: declare a través de @attachedpalabras clave, comience con una etiqueta cuando se use y agregue los parámetros correspondientes @a continuación , la función principal es agregar código para la declaración.()

Pasos para el uso

  1. Cada macro es un paquete, por lo que debe crear un paquete de macros a través del menú Xcode —> Archivo —> Nuevo —> Paquete... —> Swift Macro .
  2. Sources: El directorio de origen contiene 3 subcarpetas.
    • [Macro name]: Contiene archivos fuente de declaraciones para crear macros.
    • [Macro name]Client: contiene los archivos de origen utilizados para crear la macro.
    • [Macro name]Macros: contiene los archivos fuente de implementación para crear una macro.
  3. Cuando se usa Macro, el código expandido se puede mostrar a continuación seleccionando la macro —> menú contextual —> Expandir 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)\"")

Supongo que te gusta

Origin juejin.im/post/7261604498925223973
Recomendado
Clasificación