Número semanal rápido 37

Insertar descripción de la imagen aquí

Insertar descripción de la imagen aquí

Prefacio

Este número es el trigésimo séptimo del informe semanal compilado por el equipo editorial de Swift , y cada módulo se formó inicialmente. Si los lectores tienen alguna buena sugerencia, dejen un mensaje al final del artículo.

Swift Weekly es de código abierto en GitHub . Puedes enviar problemas, contribuir con artículos o recomendar contenido. Actualmente está previsto que se publique cada dos semanas los lunes. Amigos con ideas afines pueden unirse a la compilación del informe semanal.

Intentar detenerse seguramente será deprimente, pero la perseverancia eventualmente conducirá a un futuro brillante. ¡Vale la pena viajar con la comunidad Swift para alcanzar la excelencia juntos!

Selecciones semanales

Noticias y comunidad: Apple cayó casi un 3%, perdiendo 189.800 millones de dólares en valor de mercado en dos días

Propuesta: La propuesta de iteración del paquete está bajo revisión.

Foro Swift: Consistencia de tuplas definida por el usuario propuesta

Publicación de blog recomendada: Seguridad de subprocesos en Swift y cómo usar bloqueos

Discusión del tema:

¿Cómo elegirías entre HUAWEI Mate 60 Pro y iPhone 15?

Noticias y comunidad

Apple cayó casi un 3% y su valor de mercado se evaporó en 189.800 millones de dólares en dos días.

Es raro que el precio de las acciones de Apple caiga durante dos días consecutivos. Al cierre, Apple cotizaba a 177,56 dólares, una disminución del 2,92%, y su último valor de mercado era de 2,8 billones de dólares. La caída acumulada de Apple durante dos días consecutivos fue del 6,5% y su valor de mercado se evaporó en 189,8 mil millones de dólares (aproximadamente 1,391,1 mil millones de yuanes) en dos días.

En términos de noticias, según China Fund News, por un lado, la próxima semana se anunciará la serie de teléfonos móviles iPhone 15, lo que supondrá una feroz competencia con los teléfonos móviles Huawei de mayor venta actualmente. Hay informes de que los teléfonos móviles iPhone han sido prohibidos en determinadas ocasiones.

También se informa que la Unión Europea ha publicado una lista de las regulaciones digitales más estrictas, y gigantes tecnológicos como Apple se encuentran entre ellos.

Según Shanghai Securities News, la Unión Europea anunciará el miércoles la primera lista de servicios regulados por la Ley de Mercados Digitales (DMA). Esta lista incluirá algunos de los “guardianes”, los gigantes tecnológicos que tienen monopolios absolutos. Actualmente ya están en la lista Apple, Microsoft, Amazon, Alphabet, Meta y Samsung, empresas que asumirán las obligaciones estipuladas en la DMA como no abusar de su dominio de mercado para suprimir o adquirir competidores, ni establecer vínculos con competidores.

Según la DMA, las empresas "guardianes" desempeñan un papel clave en el mercado digital y tienen una enorme influencia en el mercado, por lo que deben estar sujetas a una supervisión más estricta. Las condiciones específicas son: la facturación anual de la empresa supera los 7.500 millones de euros, el valor de mercado supera los 75.000 millones de euros (82.000 millones de dólares) y tiene una plataforma con 45 millones de usuarios activos mensuales en la UE. Sin embargo, más allá de estos objetivos brutos, la UE tiene cierta discreción sobre las regulaciones.

Al mismo tiempo, la Comisión Europea también inició cuatro investigaciones de mercado para evaluar más a fondo si Microsoft Bing, Edge, Microsoft Ads y Apple iMessage pueden quedar exentos.

Un portavoz de Apple dijo que la compañía sigue "muy preocupada por los riesgos de privacidad y seguridad de los datos que DMA representa para nuestros usuarios". "Nuestro enfoque será mitigar estos impactos y continuar brindando el mejor servicio posible a nuestros clientes europeos". servicios (Fuente: Daily Economic News)

Los pedidos de la serie iPhone 15 disminuyen, Apple enfrenta un doble impacto en el mercado

El 4 de septiembre, según fuentes de terceros, Apple espera que el mercado mundial de teléfonos inteligentes se debilite en la segunda mitad de 2023, por lo que la cantidad de iPhone 15 pedidos puede disminuir.

Anteriormente, Apple anunció que el lanzamiento de su nuevo producto de otoño de 2023 se llevará a cabo a la 1 a. m. del 13 de septiembre, hora de Beijing, y en el lanzamiento también se presentará oficialmente la tan esperada serie de teléfonos inteligentes iPhone 15.

A medida que se acerca la fecha de lanzamiento, la situación de las existencias de la cadena de suministro de la serie iPhone 15 también ha atraído la atención de la industria.

Los analistas revelaron que Apple había realizado pedidos de la serie iPhone 15 en la segunda mitad de este año a la cadena de suministro en agosto de este año, con un volumen de pedidos que oscilaba entre 80 y 90 millones de unidades.

Sin embargo, cuando el iPhone 14 está a punto de presentarse en agosto de 2022, los pedidos de Apple para la serie iPhone 14 realizados por Apple en la cadena de suministro oscilan entre 90 millones y 100 millones de unidades. El volumen de pedidos del iPhone 15 de hoy es un 2% mayor que el del año pasado. Volumen de pedidos de iPhone 14. ¡Una fuerte caída!

En agosto, Apple consideró principalmente las condiciones del mercado en la segunda mitad del año al realizar pedidos. Apple citó el debilitamiento del mercado mundial de teléfonos inteligentes como la razón de la caída de los pedidos.

Según datos de investigación publicados por Canalys, en el primer semestre de 2023, los envíos mundiales de teléfonos inteligentes alcanzaron 528 millones de unidades, una disminución interanual del 12%. El mercado chino de teléfonos inteligentes envió 132 millones de unidades, una disminución interanual. del 8%.

Ni el mercado chino de teléfonos móviles ni el mercado mundial de teléfonos móviles se han recuperado de la crisis de la industria de la telefonía móvil y los envíos siguen cayendo. (Fuente: Tencent New Quotes Pro)

El rival de Apple ha vuelto

Al mediodía del 29 de agosto, sin previo aviso ni conferencia de prensa, Huawei publicó oficialmente una "Carta a los usuarios de Huawei", en la que se afirmaba que Huawei lanzó el "Plan Pionero HUAWEI Mate 60 Pro" a las 12:08 de ese día. se lanza oficialmente en Huawei Mall.

Aunque no hubo ninguna advertencia, el Huawei Mate 60 Pro aún recibió una atención generalizada y las noticias sobre Huawei de repente se convirtieron en un tema de búsqueda candente en Weibo.

Posteriormente, en tan solo unas horas, el primer lote de Mate 60 Pro en el Huawei Mall se agotó e innumerables internautas llamaron a Huawei para que se diera prisa y lanzara el siguiente lote.

Lo que es aún más sorprendente es que la velocidad de red del Huawei Mate 60 Pro ha alcanzado el nivel 5G y también tiene funciones de llamada por satélite, lo que indica que la calidad del chip del teléfono móvil ha alcanzado el nivel del chip 5G. Huawei realmente renace después el desastre y el rey ha vuelto.

En ese momento, Apple entró en pánico y anunció presa del pánico que lanzaría la serie de teléfonos móviles iPhone 15 el 13 de septiembre como protección contra el lanzamiento de nuevos teléfonos móviles por parte de Huawei.

Se puede decir que Apple y Huawei son viejos rivales en la industria de la telefonía móvil. En 2019, si no sucede nada inesperado, las ventas y la participación de mercado de teléfonos móviles de Huawei superarán a Apple y se convertirán en el mayor fabricante de teléfonos móviles del mundo.

Sin embargo, después de eso, todos vieron que la cadena de suministro de Huawei estaba en crisis y tuvo que separar la submarca Honor. Incluso cuando los teléfonos móviles entraron de lleno en la era 5G, solo pudo lanzar teléfonos móviles 4G.

En el primer semestre de este año, las ventas de teléfonos móviles de Huawei han caído por completo del top 7 de la industria. La industria alguna vez creyó que Huawei podría retirarse de la industria de la telefonía móvil.

Sin embargo, ahora Huawei realmente ha superado las dificultades y regresó con el Mate 60, ¡que ha conmocionado directamente al mercado mundial de teléfonos móviles!

El 4 de septiembre, según informes de los medios, Huawei aumentó los pedidos de sus teléfonos móviles de la serie Mate 60 a entre 15 y 17 millones de unidades.

Los expertos de la industria predicen que el Mate 60 Pro se convertirá en el teléfono móvil más vendido de la serie Mate de Huawei, con pedidos finales de alrededor de 17 millones de unidades. (Fuente: Tencent New Quotes Pro)

sugerencia

Propuestas aprobadas

SE-0405 La propuesta de inicializadores de cadenas con validación de codificación pasa la revisión. Esta propuesta ha sido presentada en detalle en el módulo de propuestas que se analiza en el trigésimo quinto informe semanal .

Propuestas bajo revisión

La propuesta de iteración del paquete SE-0408 está bajo revisión.

Basándose en la propuesta de bolsa de parámetros de valor y tipo SE-0393, esta propuesta permite la iteración sobre cada elemento en una bolsa de parámetros de valor y for-invincular cada valor a una variable local usando la sintaxis.

propuesta rechazada

SE-0403 Propuesta de soporte de destino de lenguaje mixto del administrador de paquetes rechazada. Esta propuesta ha sido presentada en detalle en el módulo Propuesta en Revisión del trigésimo cuarto informe semanal .

Foro rápido

  1. Consistencia de tupla propuesta definida por el usuario

introducir

Las tuplas no pueden ajustarse a los protocolos actuales, y esto se manifiesta en forma de limitaciones obvias, como la imposibilidad de utilizar tuplas de valores hash como claves de diccionario.

motivación

La motivación para SE-0283, que anteriormente abordaba el deseo de que las tuplas se ajustaran a ciertos protocolos de biblioteca estándar, proponía soporte de lenguaje integrado para tuplas Equatable, Comparable y Hashable. Independientemente, el trabajo de concurrencia de Swift agrega una extensión de lenguaje donde las tuplas de valores enviando son en sí mismas envíables. Proponemos unificar todo este comportamiento de casos especiales con la conformidad de tuplas definida por el usuario, que ahora se puede expresar mediante paquetes de parámetros (SE-0393). Tanto SE-0283 como SE-0393 enumeran la coherencia de tuplas como una dirección futura.

Solución sugerida

Recomendamos introducir una sintaxis de extensión parametrizada, como se describe en la declaración genérica. En un caso específico, se permite declarar consistencia de tuplas en su forma más general usando esta sintaxis:

extension <each T> (repeat each T): P where repeat each T: P { ... }

También permitiremos que los alias de tipos generales que describen tuplas se extiendan con coherencia condicional; proponemos que se agreguen los siguientes alias de tipos de tuplas a la biblioteca estándar para facilitar la implementación:

protocol Shape {
  func draw()
}

typealias Tuple<each Element> = (repeat each Element)

extension Tuple: Shape where repeat each Element: Shape {
  func draw() {
    repeat (each self).draw()
  }
}

Recuerde que los requisitos del protocolo los cumplen los testigos de tipos conformes específicos. Arriba, declaramos una extensión de tupla, por lo que el testigo de draw() implementa el requisito del protocolo draw() en una tupla. La implementación real llama a draw() en cada elemento, que a su vez se ajusta a la Forma. Tenga en cuenta el uso de cada self en el patrón repetitivo del cuerpo de draw().

diseño detallado

Cualquier tupla sin etiquetar se puede obtener mediante sustitución del tipo de tupla sin etiquetar "más general". El tipo más general es (repetido para cada T) si cada T es una bolsa de parámetros de algún tipo; es decir, el tipo tupla formado por la extensión de la bolsa de los elementos de cada T.

Hoy en día, los tipos de extensión extendida deben ser tipos nominales, ya sean estructuras, enumeraciones, clases o protocolos. Proponemos permitir la extensión de los tipos de tuplas más generales; esto se denomina extensión de tuplas. Dado que las extensiones pueden declarar conformidad con el protocolo, las extensiones de tupla pueden implementar requisitos de protocolo para los tipos de tupla más comunes. Esto se llama consistencia de tupla.

Esto significa que el tipo de self en la extensión de tupla es (repetido para cada T), donde cada T es un argumento común a la extensión que declara coherencia. Debido a SE-0399, cada referencia a uno mismo en una expresión de expansión de paquete se expandirá a los elementos de la tupla.

Al igual que con las extensiones de estructura, enumeración y clase, Self en extensiones de tupla se refiere al tipo de self, es decir (repetido para cada T).

Una vez que se declara la coherencia de la tupla para un determinado protocolo P, cualquier tipo de tupla satisfará los requisitos de coherencia de P siempre que los elementos de la tupla cumplan los requisitos condicionales de la coherencia de la tupla. Como veremos a continuación, los requisitos condicionales deben consistir en exactamente un requisito que se repita cada T:P. Cuando se invoca un requisito de protocolo sobre un valor de tipo tupla, se forma un paquete a partir de los elementos del tipo de tupla; esto se convierte en un parámetro común para cada T en el testigo del protocolo de llamada.

Reglas huérfanas

En la mayoría de los casos, la conformidad de tuplas se comporta como si fuera una conformidad retroactiva definida por el usuario en tipos de biblioteca estándar. En particular, no es válido que dos módulos definan dos tuplas diferentes que se ajusten al mismo protocolo. Por lo tanto, prohibimos que las tuplas se ajusten a protocolos fuera del módulo de definición.

Expansión de tupla de un solo elemento

Los tipos de tuplas de un solo elemento se expanden después del reemplazo de acuerdo con las reglas especificadas en la propuesta del paquete de parámetros. Esto significa que la consistencia de la tupla debe ser coherente con este desarrollo.

Esto impone algunas restricciones sobre la forma que puede adoptar la coherencia de la tupla. Podemos entender todas las siguientes restricciones en forma de gráfico conmutativo. La fila superior muestra los tipos de tupla más comunes, las conformidades de tupla correspondientes y algunos testigos del tipo A asociado. Ahora, aplicamos la sustitución a cada objeto, reemplazando cada bolsa de parámetros de tipo T con una bolsa que contiene un único tipo concreto, digamos X. Requerimos que todos los caminos en el gráfico que comienzan y terminan en el mismo objeto produzcan el mismo resultado:

(repeat each T) ---> [(repeat each T): P] ---> (repeat each T).A
      |                        |                        |
      |                        |                        |
      v                        v                        v
      X -------------------> [X: P] -----------------> X.A

En concreto, estas restricciones son las siguientes:

  • Las extensiones de tupla deben declarar conformidad con un protocolo.

  • Esta condición de conformidad requiere que cada T se repita exactamente: P, donde cada T es un paquete de parámetros de tipo extendido y P es el protocolo de conformidad.

  • Es decir, una extensión de tupla que extienda a Tupla: P donde se repite cada T: Q no tiene sentido, ya que en el caso de un solo elemento decaerá a X: P donde X: Q; cuando P y Q podrían ser Esta afirmación es generalmente falso cuando no es relevante para el acuerdo.

  • El tipo asociado de P requiere que A sea presenciado por un alias de tipo cuyo tipo subyacente sea exactamente (repetir (cada T).A); es decir, el tipo de tupla de A se proyecta desde cada elemento.

Es decir, si XA es un Int y YA es un String, entonces no tenemos más remedio que exigir que (X, Y).A sea igual a (Int, String).
Tenga en cuenta que debido a todas estas reglas, una tupla() vacía se ajustará a todos los protocolos con conformidad de tupla.

comportamiento dinámico

Las reglas anteriores nos permiten garantizar que el testigo de coherencia de tupla nunca será llamado por un paquete de un solo elemento, en cuyo caso la llamada se reenviará directamente al elemento de coherencia. Por lo tanto, el tipo de tiempo de ejecución de Self en conformidad con tuplas siempre debe ser el tipo de tupla verdadero, no el elemento desempaquetado.

Si una función utiliza un paquete de parámetros para formar un valor de tupla a partir del paquete, el requisito de protocolo para llamar a ese valor será invocar un testigo de coherencia de tupla o un testigo para un solo elemento, según el tamaño del paquete.

Etiquetar tuplas y varianza

Las etiquetas de tupla no son algo que los paquetes de parámetros puedan abstraer. Sin embargo, el sistema de tipos de expresión define relaciones de subtipos entre tuplas etiquetadas y las correspondientes tuplas no etiquetadas.

Por analogía con las clases, si la coherencia se declara en una clase C no final y existe una relación de subclase en la que D hereda de C, la coherencia también la hereda D.

Para que reemplazar C con D sea válido en el caso de herencia de clases, requerimos que Self se use solo en posiciones covariantes o contravariantes, no invariantes. Por lo tanto, debemos imponer a las tuplas las mismas restricciones que imponemos actualmente a las clases no finales.

Esto permite las siguientes operaciones:

  • Cumpliendo con protocolos como Equatable, Self aparece en la posición de parámetro.
  • Cumple con el hipotético protocolo Clonable, con func clone() -> Selfel requisito de devolver Self.

Por otro lado, está prohibido:

  • Cumple con los protocolos que exigen que la posición propia no se modifique, por ejemplo func f() -> G<Self>.

En este caso, no es del todo razonable tomar una tupla etiquetada y G<>aplicarla al tipo de tupla no marcada correspondiente.

Ámbito de uso

Debido al sutil comportamiento estático y dinámico descrito anteriormente, esperamos que la coherencia de tuplas siga siendo una característica avanzada. Para muchos propósitos, es mejor declarar una estructura genérica variada de propósito especial a través de SE-0398 y hacer que se ajuste al protocolo, ya que esto proporciona total flexibilidad sin complicaciones en términos de coherencia:

struct EggFactory<each Bird> {}

extension EggFactory: OmletMaker where repeat each Bird: Chicken {}

Este patrón también permite que los tipos variados definan constructores y descriptores de acceso personalizados para aplicar invariantes, etc.

Las tuplas sólo deben ajustarse a protocolos que tengan una implementación "algebraica" obvia que se generalice inductivamente a todas las combinaciones de tipos de elementos, como los tres protocolos de biblioteca estándar discutidos anteriormente.

Por ejemplo, hacer que las tuplas se ajusten a IteratorProtocol probablemente no sea una buena idea, ya que hay al menos dos implementaciones obvias: compresión o concatenación (en cuyo caso también debemos exigir que todas las secuencias tengan el mismo tipo de elemento, lo cual no permite la coherencia de tuplas). incluso expresarse).

  1. Discutir ¿Es DispatchPrecondition una forma razonable de implementar tipos de envío @unchecked?

Estoy tratando de mejorar mi @unchecked Sendablecomprensión sobre cuándo tiene sentido usar .

Por ejemplo, usar dispatchPreconditionla garantía de que los valores solo se puedan leer o modificar en el hilo principal:

/// A wrapper that guaruntees that its value is only read or modified on the main thread.
/// For simplicity assume `T` is a value type.
final class MainThreadWrapper<T> {

  init(_ value: T) {
    dispatchPrecondition(condition: .onQueue(.main))
    _value = value
  }

  var value: T {
    get {
      dispatchPrecondition(condition: .onQueue(.main))
      return _value
    }
    set {
      dispatchPrecondition(condition: .onQueue(.main))
      _value = newValue
    }
  }

  private var _value: T

}

Por el bien de la discusión, supongamos que el valor ajustado es un tipo de valor (en lugar de un tipo de referencia), por lo que no necesitamos tener en cuenta las modificaciones sin un definidor de valores.

@unchecked Sendable¿Es razonable hacer que este tipo se pueda enviar mediante coherencia?

// Is this reasonable, given the expectations of Sendable?
extension MainThreadWrapper: @unchecked Sendable { }

Las carreras de datos no son posibles cuando se utiliza este tipo. Si se usa un tipo incorrecto en el hilo equivocado (por ejemplo, en una tarea que no sea el actor principal), dispatchPreconditionfallará y bloqueará el uso no permitido:

struct NotSendable {
  var value: String
}

let wrapper = MainThreadWrapper(NotSendable(value: "foo"))

Task {
  // Allowed by the compiler since wrapper is Sendable, 
  // but a triggers a runtime error:
  print(wrapper.value)

  await MainActor.run {
    // Safe, prints "NotSendable(value: "foo")"
    print(wrapper.value)
  }
}

Dado que este tipo se puede pasar de forma segura entre dominios simultáneos sin carreras de datos, tiendo a pensar que este es un @unchecked Sendablecaso de uso razonable para .

¿Qué piensa la gente? Estoy particularmente interesado en escuchar posibles contraargumentos.

respuesta

El contenedor aquí mantiene los datos subyacentes "seguros", pero se romperá si el tipo alguna vez se usa fuera de la cola principal. Esto solo funciona para @MainActortipos declarados como... pero una vez que lo anota de esta manera, tendrá la garantía en todos los dominios concurrentes de que será el actor principal.

Con respecto a lo que significa "seguro" para usted, @unchecked Sendablees una promesa de que su tipo puede usarse en cualquier dominio concurrente y aún así proteger su propio estado. No creo que sea correcto etiquetar así los envoltorios. Todavía solo es seguro usarlo desde la cola principal. (Si este no fuera el caso, fallaría rápida y eficientemente).

  1. Discusión Swift no compilará un diccionario con ReferenceWritableKeyPath a menos que sea un atributo de clase

Este código puede ser compilado por:

@objcMembers final class DriversLicense1: NSObject {
    private let map: [String: ReferenceWritableKeyPath<DriversLicense1, String>] = [
        "DAA": \DriversLicense1.nameFull,
    ]
    private(set) var nameFull: String = ""

    override init() {
        super.init()

        for (key, keyPath) in map {
            self[keyPath: keyPath] = key
        }
    }
}

Sin embargo, este código no se compila; el error es:

cannot convert value of type 'KeyPath<DriversLicense2, String>' to expected dictionary value type 'ReferenceWritableKeyPath<DriversLicense2, String>'
fileprivate let map: [String: ReferenceWritableKeyPath<DriversLicense2, String>] = [
    "DAA": \DriversLicense2.nameFull,
]
@objcMembers final class DriversLicense2: NSObject {
    private(set) var nameFull: String = ""

    override init() {
        super.init()

        for (key, keyPath) in map {
            self[keyPath: keyPath] = key
        }
    }
}

¿Por qué?

Respuesta
Este definitivamente parece un lugar donde los diagnósticos podrían ser más útiles: obtendrá mejores noticias si intenta usar el configurador directamente en la misma ubicación:

No se puede asignar a la propiedad: no se puede acceder al configurador 'nameFull'

Parece que podemos observar KeyPath -> (Reference)WritableKeyPathlas circunstancias bajo las cuales se intenta la conversión y proporcionar diagnósticos especiales si podemos formar una ruta de clave de escritura adecuada mientras el configurador está visible en el alcance actual.

  1. Discusión No se puede llamar al método de extensión rápida desde la clase Objective C

Creé una extensión rápida para la clase ViewController y definí un método en ella. Cuando intento llamar al mismo método desde el mismo Obj-c ViewController, aparece el siguiente error:

ViewController@interfaceNo hay selector de declaración visibletestMe

Mi código es el siguiente:

Clases de Objective-C

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

[self testMe]; // No visible @interface for 'ViewController' declares the selector 'testMe'

}
@end

Extensión Swift:
// ViewController+extnesion.swift

import UIKit

@objc public extension ViewController {
    
    func testMe() {
        print("Vish")
    }
}

respuesta

Sus archivos .m deben importar los encabezados de compatibilidad emitidos por el compilador Swift.

  1. Discusión Las estructuras genéricas que usan bolsas de tipo no pueden almacenar cierres en propiedades que usan la misma bolsa de tipo
struct Foo<each T> {
    let foo: (repeat each T) -> Void

    init(
        fn: @escaping (repeat each T) -> Void
    ) {
        self.foo = fn
    }
}

El compilador responde con el siguiente mensaje usando Xcode 15.0 beta 8 (15A5229m) y la cadena de herramientas swift-DEVELOPMENT-SNAPSHOT-2023-09-04-a

error: type of expression is ambiguous without a type annotation
        self.foo = fn
        ~~~~~~~~~^~~~

Publicaciones de blog recomendadas

SwiftDataKit: le permite utilizar las funciones avanzadas de Core Data en SwiftData

Resumen: SwiftDataKit está diseñado para ayudar a los desarrolladores a utilizar las funciones avanzadas de Core Data en SwiftData. Debido a que SwiftData es el sucesor de Core Data, mejora y amplía Core Data en muchos aspectos. Sin embargo, la versión actual de SwiftData no puede implementar completamente todas las funciones avanzadas de Core Data, lo que puede ser un problema para algunos desarrolladores.

Para resolver este problema, el autor creó SwiftDataKitla biblioteca para permitir a los desarrolladores utilizar las funciones avanzadas de Core Data en SwiftData extrayendo los objetos Core Data subyacentes en SwiftData.

Seguridad de subprocesos y uso de bloqueos en Swift

Resumen: este artículo analiza la seguridad de subprocesos y el uso de bloqueos en Swift. Comienza con una introducción a la importancia de la seguridad de los subprocesos y menciona problemas relacionados que se encuentran en el código base. Luego demuestra el concepto de gestión estatal a través de un código de ejemplo simple e ilustra situaciones en las que dicho código puede conducir a carreras de datos y condiciones de carrera.

Para resolver este problema, el autor introduce el uso de un mecanismo de bloqueo para controlar el acceso concurrente a variables compartidas. OSAllocatedUnfairLockPara lograr la seguridad de los subprocesos, el blog muestra cómo usar NSRecursiveLockdos tipos de bloqueos en Swift . Finalmente, el blog concluye resumiendo la importancia de hacer que las clases sean seguras para subprocesos y alentar la inversión de tiempo en las primeras etapas del proceso de desarrollo para crear código con seguridad de tipos.

Análisis de los principios subyacentes de las funciones de orden superior de la serie Array del lenguaje Swift

Resumen: este artículo presenta el código fuente interno de funciones como filter,,,, y otras funciones en matrices Swift, y analiza la lógica de forEachimplementación . Las funciones de orden superior de la serie Array son en realidad funciones de orden superior de y también son adecuadas para otros tipos de colecciones como Set, etc. El diseño general también es bastante inteligente y utiliza muchas características específicas de Swift , que también nos inspirarán a diseñar código Swift en el futuro.mapcompactMapflatMapreduceCollectionDictionaryProtocol

Discusión del tema

Recientemente, Huawei lanzó el "Plan Pionero HUAWEI Mate 60 Pro", que verdaderamente representa un renacimiento después del desastre y el regreso del rey. Apple lanzará la serie de teléfonos móviles iPhone 15 el 13 de septiembre y ha comenzado la verdadera colisión de reyes, así que si estás pensando en cambiar tu teléfono móvil en un futuro próximo, ¿cómo elegirás?

1. Los fanáticos de Apple no necesitan tomar una decisión. Dudar aunque sea por un segundo es una falta de respeto hacia Apple.
2. Elija decididamente Huawei: es una elección extremadamente rentable y absolutamente racional.
3. Creo que el mijo que cuesta entre mil y dos mil yuanes es bastante bueno. ¿No sería delicioso si comprara dos libras más de costillas de cerdo?

Bienvenido a dejar un mensaje al final del artículo para participar en la discusión.

sobre nosotros

La comunidad Swift es una organización de bienestar público mantenida conjuntamente por entusiastas de Swift. Operamos principalmente cuentas públicas de WeChat en China. Compartiremos contenido técnico con la práctica de Swift , SwiftUl y los conceptos básicos de Swift como núcleo, y también compilaremos y recopilaremos excelentes materiales de aprendizaje.

Un agradecimiento especial a todos los editores del Departamento Editorial de la Comunidad Swift por su arduo trabajo, brindando contenido de alta calidad para la comunidad Swift y contribuyendo al desarrollo del lenguaje Swift.

Supongo que te gusta

Origin blog.csdn.net/qq_36478920/article/details/132801284
Recomendado
Clasificación