Swift Hebdomadaire Numéro 33

insérez la description de l'image ici
insérez la description de l'image ici

avant-propos

Ce numéro est le vingt-quatrième numéro du rapport hebdomadaire organisé indépendamment par l'équipe éditoriale de Swift , et chaque module a été initialement formé. Si les lecteurs ont de bonnes suggestions, n'hésitez pas à laisser un message à la fin de l'article.

Swift Weekly est open source sur GitHub , bienvenue pour soumettre des problèmes, contribuer ou recommander du contenu. Il est actuellement prévu de le publier toutes les deux semaines le lundi, et les amis partageant les mêmes idées sont invités à se joindre à la compilation du rapport hebdomadaire.

Regardez l'eau claire et le ciel bleu, les vagues sont magnifiques. Une brève lecture de la communauté Swift est enrichissante et éclairante. L'espoir est brillant, tout y est !

En vedette hebdomadaire

Actualités et communauté : achats et abonnements intégrés à l'application, modifications tarifaires et fiscales à venir

Proposition : Utiliser des macros de conformité comme macros d'extension

Swift Forum : Discutez de la signification de \et$

Article de blog recommandé : Implémentation d'un framework d'animation iOS léger

Débat sur le sujet :

Le dernier classement des salaires est publié. Le salaire mensuel moyen à Guangzhou est de 10 883 yuans et le salaire mensuel moyen à Pékin est de 13 438 yuans. Quel est votre salaire mensuel ?

nouvelles et communauté

Modifications à venir des prix et des taxes pour les achats et les abonnements intégrés

Les mécanismes de transaction et de paiement de l'App Store sont conçus pour vous aider à évaluer et vendre facilement vos produits et services dans 44 devises sur des vitrines dans 175 pays et régions du monde. Lorsque les réglementations fiscales ou les taux de change changent, les prix dans certaines régions de l'App Store sont parfois mis à jour et vos revenus seront ajustés. Ces ajustements seront effectués sur la base des informations sur les taux de change accessibles au public fournies par les agences de données financières afin de garantir que les prix des applications et des achats intégrés sont équilibrés sur toutes les vitrines.

À partir du 25 juillet, les prix des applications et des achats d'applications (à l'exclusion des abonnements à renouvellement automatique) dans les vitrines d'Égypte, du Nigeria, de Tanzanie et de Turquie seront ajustés. Ces ajustements comprennent également les changements de taux d'imposition suivants :

Égypte : 14 % de taxe sur la valeur ajoutée (TVA)
Tanzanie : 18 % de TVA et 2 % de taxe sur les services numériques
Turquie : le taux de TVA est passé de 18 % à 20 %
L'impact de ces ajustements sur les prix
Si vous choisissez l'Égypte, le Nigéria, la Tanzanie ou La Turquie en tant que vitrine de base pour les articles achetés dans l'application ou dans l'application (à l'exclusion des abonnements renouvelables automatiquement), les prix dans les vitrines correspondantes ne changeront pas. Les prix dans les autres vitrines seront mis à jour pour correspondre au prix de base que vous avez choisi.
Si vous sélectionnez une vitrine de base autre que l'Égypte, le Nigéria, la Tanzanie ou la Turquie pour votre application ou votre achat intégré (à l'exclusion des abonnements renouvelables automatiquement), le prix sera augmenté dans les vitrines de l'Égypte, du Nigéria, de la Tanzanie et de la Turquie.
Si votre achat intégré est un abonnement à renouvellement automatique, ou si vous gérez manuellement les prix sur les vitrines au lieu d'utiliser le nivellement automatique, votre prix ne changera pas.
La section Prix et disponibilité de Mes applications dans App Store Connect a été mise à jour pour refléter ces prochains ajustements de prix. Comme toujours, vous pouvez modifier le prix de vos applications, des achats intégrés et des abonnements auto-renouvelables à tout moment.

Impact de ces ajustements sur les revenus et l'administration fiscale
Les revenus que vous recevez des ventes d'applications et des achats intégrés (y compris les abonnements à renouvellement automatique) changeront pour refléter le nouveau taux de taxe et les prix mis à jour. L'annexe B du contrat d'application payante a été mise à jour pour indiquer qu'Apple perçoit et verse les taxes applicables en Égypte et en Tanzanie.

Offrez une expérience d'application sécurisée à la famille

L'App Store a été créé pour fournir aux utilisateurs un endroit sûr et fiable pour télécharger des applications et pour offrir aux développeurs de grandes opportunités commerciales. Les plates-formes Apple et les applications que vous créez sont importantes pour de nombreuses familles, car les enfants utilisent nos produits et services pour explorer le monde numérique et se connecter avec leur famille et leurs amis. Nous plaçons la barre extrêmement haute pour les applications destinées aux enfants et celles dont le contenu et les interactions sont générés par les utilisateurs. Afin de continuer à créer une expérience sûre pour les familles, nous souhaitons vous rappeler que nous disposons d'une variété d'outils, de ressources et d'exigences pour vous aider à assurer la sécurité des utilisateurs dans votre application.

suggestion

Propositions en cours d'examen

SE-0398 La proposition de transformer des macros de conformité en macros d'extension est en cours d'examen.

La proposition conformancegénéralise les macrorôles aux extensionmacrorôles, qui, en plus des protocoles et des clauses where, peuvent ajouter des listes de membres aux extensions.

Forum Swift

  1. Est-ce une faute de frappe pour en discuter ?

Demander:

En regardant la vidéo SwifUIi, j'ai vu deux choses qui ressemblaient à des fautes d'orthographe. Vous vous demandez pourquoi leurs expressions sont si ambiguës :

À quoi sert la barre oblique inverse ?

var body: some View {
    List (graphics, children: \.children) { graphic in
        GraphicRow (graphic)
    }
    .listStyle(SidebarListStyle())
}

A quoi sert le signe dollar ?

var body: some View {
    DocumentGroup (newDocument: SketchDocument()) { file in
        DocumentView(file.$document)
    }
}

répondre:

Ce ne sont pas des fautes de frappe. Ce sont des symboles utilisés pour accéder à des fonctionnalités linguistiques spécifiques qui génèrent un contenu lié à un attribut nommé, plutôt que d'accéder normalement à cet attribut.

Swift utilise \ dans la position de l'opérateur de préfixe pour créer un "chemin clé", un objet qui représente généralement (dans ce cas) une Graphic.childrenpropriété plutôt qu'une Graphicpropriété spécifiqueChildren  ; cet objet peut être appliqué à n'importe quelle instance de Graphic pour accéder à sa propriété Children.

Dans d'autres langages, le caractère \ est courant dans les littéraux de chaîne, où il commence une "séquence d'échappement", mais il est rarement utilisé comme opérateur, et il y a peu de cohérence entre les langages qui l'utilisent.

Il y a une sorte de vague connexion à l'idée de "s'échapper" ici, puisque dans les deux cas, vous progressez vers des niveaux de signification plus abstraits, mais dans la plupart des cas, il est choisi parce que c'est un Les symboles inutilisés sont généralement faciles à tapez et regardez bien. La proposition d'évolution de cette fonctionnalité traite en fait de plusieurs syntaxes différentes et explique pourquoi les barres obliques inverses ont été choisies .

Le préfixe $ signifie que vous accédez à une fonctionnalité spéciale fournie par le wrapper de propriété pour la propriété concernée. Ici, la propriété est FileDocumentConfiguration.document, selon la documentation, un @Bindingwrapper de propriété. Cela signifie que $document exposera une liaison au document - un objet qui peut être utilisé pour accéder et modifier les propriétés de ce document sans se soucier de l'endroit où il est réellement stocké.

Nous appelons cette variable $ une "valeur projetée" plutôt qu'une "valeur liée" ou autre, car la syntaxe $ est une fonctionnalité générale du langage, donc si vous utilisez autre chose que @Binding, la propriété $ peut ne pas créer de liaison ; peut se voir attribuer une autre fonction.

Ces deux syntaxes n'ont pas été choisies parce qu'elles seraient immédiatement familières, mais parce que nous étions sûrs qu'aucune des syntaxes n'était immédiatement familière, et qu'il valait mieux choisir une syntaxe que les développeurs auraient besoin d'apprendre mais qu'ils trouveraient facile à utiliser une fois qu'ils l'auraient fait. .

  1. Discussion NSLock.Lock plus Await plus NSLock.Unlock provoque le blocage du thread principal

Demander:

Le code suivant simule la situation où l'auteur d'une bibliothèque externe introduit des verrous, qui peuvent contenir des appels d'attente.

Est-il un moyen d'empêcher cela

L'annotation noasync n'est pas une solution car :

1) Si la fonction est encapsulée dans une autre fonction sans l'annotation noasync, cela ne fonctionne pas ;
2) L'auteur de la bibliothèque tierce peut oublier d'ajouter une telle annotation.

let lock = NSLock()

func thirdPartyLibLock() {
    print("- do sum work and lock")
    lock.lock()
    /*
     I also tried to replace it with:
         await withCheckedContinuation({ c in
             lock.lock()
             c.resume()
         })
     */
}

func thirdPartyLibUnlock() {
    print("- do sum work and unlock")
    lock.unlock()
    /*
     I also tried to replace it with:
         await withCheckedContinuation({ c in
             lock.unlock()
             c.resume()
         })
     */
}

func example() {
    /*
     Console:
     - start 4
     - do sum work and lock
     - start 1
     - do sum work and lock

     And that's all. We have suspended main thread.
     Numbers 4 and 1 could differ between app launches, it's ok.
     */
    for i in 0...1000 {
        Task {
            print("- start \(i)")

            thirdPartyLibLock()
            try await Task.sleep(for: .seconds(1))
            thirdPartyLibUnlock()

            print("- end \(i)")
        }
    }

    // Won't be executed.
    DispatchQueue.main.asyncAfter(deadline: .now() + 3, execute: {
        print("- ping")
    })
}

répondre:

La paire d'API verrouiller + déverrouiller n'est pas sécurisée par conception pour un certain nombre de raisons, et c'est l'une d'entre elles. Une meilleure conception consisterait à utiliser une fonction pour acquérir le verrou, appeler le rappel, puis libérer le verrou après le retour du rappel.

(Idéalement, la fonction fournirait également un accès de rappel aux ressources protégées par le verrou qui seraient autrement inaccessibles.) L'exigence de ne pas se bloquer entre le verrouillage et le déverrouillage peut être exprimée très clairement en rendant simplement l'ensemble du processus synchrone .

  1. Discuter des fonctionnalités du langage Swift nécessaires pour améliorer l'état de la prise en charge de l'interopérabilité C++

contenu:

Swift 5.9 permet d'importer et d'utiliser différents types C++ dans Swift. Cependant, toutes les classes de type ne sont pas prises en charge. Cet article répertorie un ensemble de fonctionnalités du langage Swift requises qui nous permettent de prendre en charge la plupart des types C++ dans Swift :

Prise en charge générique des types non copiables. Bien que Swift 5.9 ait ajouté la prise en charge des structures et des énumérations non copiables, ces types ne sont toujours pas autorisés en tant que paramètres de type générique.

Il s'agit d'un problème clé qui nous empêche de terminer la prise en charge complète des types C++ de déplacement uniquement dans Swift, car nous devons former des types comme UnsafePointer qui n'ont aucune restriction de langue.

En plus du point ci-dessus, des types comme UnsafePointer et UnsafeMutablePointer devraient prendre en charge l'emprunt et l'emprunt mutable d'objets pointeurs non copiables.

Une classe de type Swift immuable/incontournable. Les types Swift non échappables et non copiables nous permettront d'importer et de modéliser des types C++ non copiables et non déplaçables dans Swift.

De plus, les fonctionnalités de langage suivantes permettront d'améliorer l'ergonomie de certaines opérations courantes effectuées sur les types C++ dans Swift :

Pour pouvoir faire une boucle for empruntée sur une séquence Swift, qui passe par le IteratorProtocol, mais peut utiliser une itération indexée. Cela nous permettra d'utiliser automatiquement des boucles for sur des collections à accès non aléatoire comme std :: map.

répondre:

Celles-ci semblent conformes à nos plans visant à affiner la prise en charge des types non copiables, ce qui est formidable. Serait-il également judicieux d'inclure les importations internes dans cette liste, ainsi que la prise en charge de l'importation de types C et C++ sans exposer indirectement leur ABI, afin de permettre aux packages d'utiliser l'interopérabilité C++ en interne sans exiger que les dépendances le sachent ?

  1. Discutez de l'ajout du protocole au module du même nom
    Demandez :

J'ai un module appelé HTML qui contient un type HTML du même nom. Son arbre ressemble à ceci :

  • HTML (module)
  • HTML (structure)
  • html.attributes (énumération)
  • HTML.ContainerElement (énumération)
  • HTML.VoidElement (énumération)

Jusqu'ici, tout va bien. Il n'est pas possible de qualifier une référence à une déclaration dans ce module car elle a le même nom, mais ce n'est pas grave car le type HTML lui-même est fonctionnellement un qualificateur d'espace de noms.

Vous voulez maintenant ajouter un protocole à ce module, appelez-le HTMLOutputStreamable. Mais vous ne pouvez pas ajouter un type de niveau supérieur à un module HTML qui n'est pas nommé HTML, car le module a le même nom, et vous ne pouvez pas qualifier une HTML.HTMLOutputStreamableréférence à ce protocole avec un .

Comment résoudre ce problème?

répondre:

Le seul moyen que j'ai trouvé est d'utiliser un nom différent.

De ce point de vue, Swift manque toujours de fonctionnalités d'espace de noms complètes. Peut être un espace de noms au niveau du module, mais il est plus complet et fiable. Je préférerais des espaces de noms comme C++ ou des définitions de modules explicites comme Rust, mais cela ne semble pas faire partie de la vision évolutive de Swift.

  1. Discussion sur les fonctions imbriquées et @ViewBuilder : erreurs de compilation étranges

Le code suivant donne une étrange erreur de compilation qui semble sans rapport :

struct ContentView: View {

    var body: some View {

        func world() -> String {
            "world"
        }

        Text("Hello, \(world())!")
    }
}

Le message d'erreur est :

Les fermetures contenant des déclarations ne peuvent pas être utilisées avec le générateur de résultats 'ViewBuilder'

Fait intéressant, si j'ajoute un retour dans world() (c'est-à-dire return "world"), le compilateur affiche une erreur ailleurs et ajoute un avertissement, dont aucun n'est très pertinent non plus. Cela ressemble plus à un bug du compilateur.

Des idées?

répondre:

Historiquement, les générateurs de résultats ont eu certaines restrictions sur la syntaxe dans laquelle ils opèrent. Beaucoup de ces restrictions ont été supprimées dans SE-0373 : Levez toutes les restrictions sur les variables dans les générateurs de résultats, mais je ne serais pas surpris si certaines restaient.

Article de blog recommandé

Implémentation d'un framework d'animation iOS léger

Résumé : Dans ce blog, nous introduisons le problème courant de l'animation des vues dans le développement quotidien et fournissons une solution. L'article montre d'abord le code d'animation général et souligne le problème de retour en arrière de sa fonction de rappel. Il introduit ensuite certaines bibliothèques d'animation populaires, telles que Spring, Hero et TweenKit, mais elles ont toutes certaines limitations. Pour résoudre ces problèmes, une manière concise, facile à utiliser et maintenable de réaliser des animations est introduite. La solution est implémentée sur la base de l'encapsulation d'Animator et d'Animation, où Animator définit le protocole de base des actionneurs d'animation et encapsule plusieurs types différents d'actionneurs d'animation. Animation définit les paramètres d'exécution de l'animation et crée différents protocoles pour différents animateurs. En outre, l'article introduit également le concept d'effacement de type pour résoudre le problème des types de paramètres incohérents. En termes d'implémentation spécifique, la méthode d'animation série et parallèle est ajoutée en étendant UIView. Enfin, les avantages et les améliorations possibles du schéma sont résumés.

Chargez des polices personnalisées dans votre application à l'aide du plugin Swift Package

Résumé : cet article décrit comment utiliser le plug-in Swift Package pour charger des polices personnalisées dans votre application. En créant un package Swift pour contenir les fichiers de police partagés et le code de chargement des polices, vous pouvez accélérer la publication de nouvelles applications, réduire la duplication de code et fournir un emplacement cohérent pour mettre à jour les fichiers de police. En combinant la réutilisabilité des packages Swift avec la puissance des plugins Swift Package, il est même possible de générer automatiquement tout le code nécessaire à partir des fichiers de police au moment de la construction. Cet article utilise SwiftGen pour montrer comment procéder. Créez d'abord un package Swift appelé "Fonts" et ajoutez-y des ressources de polices personnalisées. Ajoutez ensuite le plugin SwiftGen pour générer le code nécessaire au chargement de la police. Enfin, vous pouvez utiliser le code généré pour utiliser des polices personnalisées dans SwiftUI et UIKit.

Maîtrisez l'API Swift Foundation Formatter. style de format personnalisé

Résumé : cet article de blog décrit comment utiliser les styles de format personnalisés dans l'API Swift Foundation Formatter. L'auteur partage ses expériences d'utilisation de l'API et de construction d'une logique de formatage personnalisée dans chacun de ses projets. Le blog explique en détail le protocole FormatStyle et comment créer des styles de formatage personnalisés qui s'y conforment. Montre, à titre d'exemple, comment créer des styles de mise en forme de nombres courts et gras et montre comment les réutiliser dans des types personnalisés. Enfin, les auteurs fournissent également un moyen d'encapsuler la logique de formatage.

sujet de discussion

Le dernier classement des salaires est publié. Le salaire mensuel moyen à Guangzhou est de 10 883 yuans et le salaire mensuel moyen à Pékin est de 13 438 yuans. Quel est votre salaire mensuel ?

  1. très riche
  2. Howe
  3. Peu riche
  4. aisé
  5. pauvreté

Bienvenue à laisser un message à la fin de l'article pour participer à la discussion.

à propos de nous

La communauté Swift est une organisation à but non lucratif gérée conjointement par des passionnés de Swift. Nous exploitons principalement le compte public WeChat en Chine. Nous partagerons du contenu technique centré sur le combat Swift , SwiftUl et la fondation Swift , et organiserons et collecterons également d'excellents supports d'apprentissage.

Un merci spécial à tous les éditeurs du service éditorial de la communauté Swift, merci pour votre travail acharné, fournissez un contenu de haute qualité à la communauté Swift et contribuez au développement du langage Swift.

おすすめ

転載: blog.csdn.net/qq_36478920/article/details/131762550
33S