Attributs

Attributs

Il y a deux fonctionnalités dans Swift, qui sont utilisées pour décorer les déclarations et les types. Les fonctionnalités fournissent plus d'informations sur les déclarations et les types. Par exemple, une fonction déclarée avec la fonction discardableResult indique que bien que la fonction ait une valeur de retour, le compilateur ne générera pas d'avertissement si la valeur de retour n'est pas utilisée.

Vous pouvez spécifier une entité de la manière suivante, avec le symbole @ suivi du nom de l'entité et de tous les paramètres reçus par l'entité:

@Feature name

@ Nom caractéristique (paramètre caractéristique)

Certaines fonctionnalités déclarées spécifient plus d'informations sur la fonctionnalité et comment elle modifie une déclaration particulière en recevant des paramètres. Les paramètres de ces caractéristiques sont écrits entre parenthèses et leur format est défini par les caractéristiques auxquelles ils appartiennent.

Caractéristiques déclarées

La fonction de revendication ne peut être appliquée qu'aux revendications.

disponible

Lorsque la fonctionnalité disponible est utilisée dans une revendication, cela signifie que le cycle de vie de la revendication est relatif à une plate-forme et une version de système d'exploitation spécifiques.

La fonctionnalité disponible apparaît souvent avec la liste des paramètres, qui a au moins deux paramètres de fonctionnalité, séparés par des virgules. Ces paramètres commencent par l'un des noms de plate-forme suivants:

iOS
iOSApplicationExtension
macOS
macOSApplicationExtension
watchOS watchOSApplicationExtension tvOS tvOSApplicationExtension swift 

Bien sûr, vous pouvez également utiliser un astérisque (*) pour indiquer toutes les plateformes mentionnées ci-dessus. Spécifiez le paramètre de fonctionnalité disponible de la version Swift, qui ne peut pas être représenté par un astérisque.

Les paramètres restants peuvent apparaître dans n'importe quel ordre et des informations supplémentaires sur le cycle de vie déclaré peuvent être ajoutées, y compris les événements importants.

Le paramètre indisponible indique que l'instruction n'est pas valide sur la plateforme spécifiée. Ce paramètre ne peut pas être utilisé lors de la spécification de la disponibilité de la version Swift. Le paramètre introduit indique la version à partir de laquelle la plateforme introduira l'instruction. Le format est le suivant: introduit: numéro de version

Le numéro de version se compose d'un à trois entiers positifs, séparés par des points.

Le paramètre obsolète indique de quelle version la plateforme a déprécié la déclaration. Le format est le suivant: obsolète: numéro de version

Le numéro de version facultatif se compose d'un ou plusieurs entiers positifs, séparés par des points. L'omission du numéro de version indique que l'instruction est actuellement obsolète et qu'aucune information pertinente n'est donnée lorsque la dépréciation se produit. Si vous omettez le numéro de version, les deux points (:) peuvent également être omis.

Le paramètre obsolète indique quelle version de la plateforme ou de la langue spécifiée sera obsolète. Lorsqu'une instruction est supprimée, elle est supprimée de la plateforme ou de la langue et ne peut plus être utilisée. Le format est le suivant: obsolète: numéro de version

Le numéro de version se compose d'un à trois entiers positifs, séparés par des points.

Le paramètre message est utilisé pour fournir des informations textuelles. Lors de l'utilisation d'une instruction obsolète ou obsolète, le compilateur enverra un avertissement ou un message d'erreur. Le format est le suivant: message: contenu du message

Le contenu de l'information se compose d'une chaîne de caractères.

Le paramètre renommé est utilisé pour fournir des informations textuelles pour indiquer le nouveau nom de l'instruction renommée. Lors de l'utilisation de l'ancien nom déclaré, le compilateur signalera une erreur et vous demandera le nouveau nom. Le format est le suivant: renommé: nouveau nom

Le nouveau nom se compose d'une chaîne.

Vous pouvez utiliser le paramètre renommé et le paramètre non disponible pour la fonctionnalité disponible pour indiquer la disponibilité de la déclaration sur différentes plates-formes et versions Swift. Comme indiqué ci-dessous, cela signifie que le nom déclaré a changé entre les différentes versions d'un framework ou d'une bibliothèque. Cette combinaison indique une erreur de compilation dans laquelle l'instruction a été renommée.

// 首发版本
protocol MyProtocol {
    // 这里是协议定义
}
// 后续版本重命名了 MyProtocol protocol MyRenamedProtocol {  // 这里是协议定义 } @available(*, unavailable, renamed:"MyRenamedProtocol") typealias MyProtocol = MyRenamedProtocol 

Vous pouvez utiliser plusieurs fonctionnalités disponibles sur une instruction pour spécifier la disponibilité de l'instruction sur différentes plates-formes et versions Swift. Le compilateur n'utilisera la fonctionnalité disponible que si elle correspond à la plateforme ou à la version linguistique spécifiée dans la fonctionnalité disponible.

Si la fonctionnalité disponible spécifie un seul paramètre introduit en plus du paramètre de nom de plate-forme, vous pouvez utiliser la syntaxe raccourcie suivante à la place:

@available (numéro de version du nom de la plateforme, *)

@disponible (numéro de version rapide)

La syntaxe abrégée de la fonctionnalité disponible peut exprimer de manière concise la disponibilité de l'instruction sur plusieurs plateformes. Bien que ces deux formulaires soient fonctionnellement identiques, veuillez utiliser le formulaire de syntaxe abrégée dans la mesure du possible.

@available(iOS 10.0, macOS 10.12, *)
class MyClass {
    // 这里是类定义
}
当 available 特性需要同时指定 Swift 版本和平台可用性,需要使用单独的 available 特性来声明。  @available(swift 3.0.2) @available(macOS 10.12, *) struct MyStruct {  // 这里是结构体定义 } discardableResult

Cette fonctionnalité est utilisée dans les déclarations de fonction ou de méthode pour supprimer l'avertissement que la valeur de retour de la fonction ou de la méthode dans le compilateur est appelée sans utiliser le résultat.

dynamicCallable

Cette fonctionnalité est utilisée dans les classes, les structures, les énumérations ou les protocoles pour traiter les instances de ce type comme des fonctions appelables. Ce type doit implémenter l'une des méthodes dynamicallyCall (withArguments :), dynamicallyCall (withKeywordArguments :), ou les deux.

Vous pouvez appeler une instance de la fonction dynamicCallable, tout comme l'appel d'une fonction avec un nombre quelconque de paramètres.

@dynamicCallable
struct TelephoneExchange {
    func dynamicallyCall(withArguments phoneNumber: [Int]) {
        if phoneNumber == [4, 1, 1] {
 print("Get Swift help on forums.swift.org")  } else {  print("Unrecognized number")  }  } }  let dial = TelephoneExchange()  // 使用动态方法调用 dial(4, 1, 1) // 打印“Get Swift help on forums.swift.org”  dial(8, 6, 7, 5, 3, 0, 9) // 打印“Unrecognized number”  // 直接调用底层方法 dial.dynamicallyCall(withArguments: [4, 1, 1]) 

La déclaration de la méthode dynamicallyCall (withArguments :) doit avoir au moins un paramètre qui suit le protocole ExpressibleByArrayLiteral, tel que [Int], et le type de valeur de retour peut être n'importe quel type.

@dynamicCallable
struct Repeater {
    func dynamicallyCall(withKeywordArguments pairs: KeyValuePairs<String, Int>) -> String {
        return pairs
 .map { label, count in  repeatElement(label, count: count).joined(separator: " ")  }  .joined(separator: "\n")  } }  let repeatLabels = Repeater() print(repeatLabels(a: 1, b: 2, c: 3, b: 2, a: 1)) // a // b b // c c c // b b // a 

La déclaration de la méthode dynamicallyCall (withKeywordArguments :) doit avoir au moins un paramètre qui suit le protocole ExpressibleByDictionaryLiteral, et la valeur de retour peut être de n'importe quel type. La clé du paramètre doit suivre le protocole ExpressibleByStringLiteral. L'exemple ci-dessus utilise KeyValuePairs comme type de paramètre, afin que l'appelant puisse transmettre des étiquettes de paramètres répétées, et a et b sont utilisés plusieurs fois dans l'appel pour se répéter.

Si vous implémentez deux méthodes dynamicallyCall en même temps, lorsque l'argument mot-clé est inclus dans l'appel de méthode, la méthode dynamicallyCall (withKeywordArguments :) sera appelée, sinon la méthode dynamicallyCall (withArguments :) sera appelée.

Vous ne pouvez appeler que des instances d'appel dynamiques dont les paramètres et les valeurs de retour correspondent à l'implémentation de la méthode dynamicallyCall. L'appel dans l'exemple ci-dessous ne peut pas être compilé car son implémentation dynamicallyCall (withArguments :) n'accepte pas les paramètres KeyValuePairs <String, String>.

repeatLabels (a: "four") // Erreur dynamicMemberLookup

Cette fonctionnalité est utilisée pour les classes, les structures, les énumérations ou les protocoles, ce qui lui permet de rechercher des membres lors de l'exécution. Ce type doit implémenter un indice (indice DynamicMemberLookup :).

Dans une expression de membre explicite, si aucun membre n'est spécifié par son nom, l'expression est comprise comme un appel à l'indice (dynamicMemberLookup :) de type, en passant un paramètre qui contient la chaîne de nom de membre. Le paramètre de réception d'indice peut être un chemin de clé ou une chaîne de nom de membre; si vous implémentez les deux méthodes d'appel d'indice en même temps, la méthode du paramètre de chemin de clé prévaudra.

L'implémentation en indice (dynamicMemberLookup :) permet de recevoir des paramètres de chemin de clé de type KeyPath, WritableKeyPath ou ReferenceWritableKeyPath. Selon le protocole ExpressibleByStringLiteral, le paramètre de réception d'appel d'indice est une chaîne de nom de membre - dans la plupart des cas, le paramètre d'indice est une valeur de chaîne. Le type de valeur de retour d'indice peut être de n'importe quel type.

La recherche dynamique de membres en fonction des noms de membres peut nous aider à créer un type d'encapsuleur qui encapsule les données, mais ce type ne peut pas être vérifié au moment de la compilation, comme lorsque des données dans d'autres langues sont pontées vers la langue Swift. Par exemple:

@dynamicMemberLookup
struct DynamicStruct {
    let dictionary = ["someDynamicMember": 325,
                      "someOtherMember": 787]
 subscript(dynamicMember member: String) -> Int {  return dictionary[member] ?? 1054  } } let s = DynamicStruct()  // 使用动态成员查找 let dynamic = s.someDynamicMember print(dynamic) // 打印“325”  // 直接调用底层下标 let equivalent = s[dynamicMember: "someDynamicMember"] print(dynamic == equivalent) // 打印“true” 

Recherchez dynamiquement les membres en fonction du chemin d'accès de clé, qui peut être utilisé pour créer un type de package qui encapsule les données, dont le type est vérifié au moment de la compilation. Par exemple:

struct Point { var x, y: Int }

@dynamicMemberLookup
struct PassthroughWrapper<Value> {
 var value: Value  subscript<T>(dynamicMember member: KeyPath<Value, T>) -> T {  get { return value[keyPath: member] }  } }  let point = Point(x: 381, y: 431) let wrapper = PassthroughWrapper(value: point) print(wrapper.x) GKInspectable

Appliquez cette propriété pour exposer une propriété de composant GameplayKit personnalisée à l'interface utilisateur de l'éditeur SpriteKit.

inlinable

Cette fonctionnalité est utilisée dans la déclaration de fonctions, méthodes, attributs calculés, indices, constructeurs de commodité ou destructeurs pour exposer l'implémentation de la déclaration dans le cadre de l'interface publique du module. Le compilateur permet de remplacer le symbole inlinable par une copie de l'implémentation du symbole lors de l'appel.

Le code en ligne peut interagir avec des symboles au niveau d'accès public dans n'importe quel module, ainsi qu'avec des symboles au niveau d'accès interne qui marquent la fonctionnalité usableFromInline dans le même module. Le code en ligne ne peut pas interagir avec les symboles de niveau privé ou privé.

Cette fonctionnalité ne peut pas être utilisée pour les déclarations imbriquées dans des fonctions, ni pour les déclarations de niveaux d'accès privés ou privés. Les fonctions et fermetures définies dans les fonctions en ligne sont implicitement non en ligne, même si elles ne peuvent pas marquer la fonction.

nonobjc

Cette fonctionnalité est utilisée pour les déclarations de méthode, de propriété, d'indice ou de constructeur. Ces déclarations auraient pu être utilisées dans le code Objective-C, tandis que l'utilisation de la fonction nonobjc indique au compilateur que cette déclaration ne peut pas être utilisée dans le code Objective-C.

Cette fonctionnalité est utilisée dans les extensions et a le même effet que l'ajout de cette fonctionnalité à chaque membre dans les extensions qui ne sont pas explicitement marquées en tant que fonctionnalités objc.

Vous pouvez utiliser la fonction nonobjc pour résoudre le problème de bouclage de la méthode bridge dans la classe étiquetée objc. Cette fonctionnalité permet également de surcharger les constructeurs et les méthodes de la classe étiquetée objc.

Les méthodes marquées avec des caractéristiques nonobjc ne peuvent pas remplacer les méthodes marquées avec des caractéristiques objc. Cependant, les méthodes marquées avec des caractéristiques objc peuvent remplacer les méthodes marquées avec des caractéristiques nonobjc. De même, les méthodes marquées avec la fonctionnalité nonobjc ne peuvent pas répondre aux exigences de méthode dans le protocole marqué avec la fonctionnalité @objc.

NSApplicationMain

L'utilisation de cette fonctionnalité sur une classe indique que la classe est une classe déléguée d'application. L'utilisation de cette fonctionnalité a le même effet que d' appeler la fonction NSApplicationMain ( : :) et de transmettre le nom de classe comme nom de classe déléguée à la fonction.

Si vous ne souhaitez pas utiliser cette fonctionnalité, vous pouvez fournir un fichier main.swift et appeler la fonction NSApplicationMain ( : :) au niveau supérieur du code , comme indiqué ci-dessous:

importer AppKit NSApplicationMain (CommandLine.argc, CommandLine.unsafeArgv) NSCopying

Cette fonctionnalité est utilisée pour modifier les attributs des variables de stockage d'une classe. Cette fonctionnalité obligera la méthode de définition de la propriété à utiliser la copie de la valeur entrante pour l'affectation, et cette valeur est renvoyée par la méthode copyWithZone (_ :) de la valeur entrante. Le type de cet attribut doit être conforme au protocole NSCopying.

Le comportement de la fonction NSCopying est similaire à la fonction de copie dans Objective-C.

NSManaged

Cette fonctionnalité est utilisée pour modifier les méthodes d'instance ou les attributs de variable stockés dans les sous-classes NSManagedObject, indiquant que leur implémentation est fournie dynamiquement par Core Data au moment de l'exécution en fonction de la description d'entité pertinente. Core Data fournit également un stockage pour les attributs marqués des caractéristiques NSManaged lors de l'exécution. L'application de cette fonction signifie également la fonction objc.

objc

Cette fonctionnalité est utilisée pour décorer toute déclaration qui peut être exprimée en Objective-C. Par exemple, les classes non imbriquées, les protocoles, les énumérations non génériques (uniquement les énumérations dont les valeurs d'origine sont des entiers), les attributs et les méthodes (y compris les méthodes d'accès), les constructeurs, les destructeurs et le Opérateur standard. La fonction objc indique au compilateur que cette déclaration peut être utilisée dans le code Objective-C.

Cette fonctionnalité est utilisée dans les extensions et a le même effet que l'ajout de cette fonctionnalité à chaque membre dans les extensions qui ne sont pas explicitement marquées comme nonobjc.

Le compilateur ajoute implicitement l'attribut objc aux sous-classes de toute classe définie dans Objective-C. Cependant, les sous-classes ne peuvent pas être génériques et ne peuvent hériter d'aucune classe générique. Vous pouvez explicitement ajouter l'attribut objc aux sous-classes qui remplissent ces conditions pour spécifier son nom Objective-C, comme décrit ci-dessous. Les protocoles auxquels objc a été ajouté ne peuvent pas hériter des protocoles sans cette fonctionnalité.

La fonction objc est implicitement ajoutée dans les cas suivants.

La classe parente a la fonction objc et est réécrite en tant que déclaration de sous-classe. Suivez la déclaration avec l'accord de fonctionnalité objc. Déclaration avec les fonctionnalités IBAction, IBSegueAction, IBOutlet, IBDesignable, IBInspectable, NSManaged ou GKInspectable. Si vous appliquez la fonction objc aux énumérations, chaque cas d'utilisation d'énumération sera exposé dans le code Objective-C dans une combinaison de nom d'énumération et de nom de cas d'utilisation. Par exemple, il existe un cas d'utilisation appelé Vénus dans l'énumération Planet, qui est appelé PlanetVenus lorsqu'il est exposé dans le code Objective-C.

L'attribut objc a un paramètre facultatif, qui consiste en un identifiant. Vous pouvez utiliser ce paramètre de fonctionnalité lorsque vous souhaitez exposer l'entité modifiée par objc à Objective-C avec un nom différent. Vous pouvez utiliser ce paramètre pour nommer des classes, des types énumérés, des cas d'utilisation énumérés, des protocoles, des méthodes, des méthodes d'accès et des constructeurs. Si vous souhaitez spécifier le nom d'une classe, d'un protocole ou d'une énumération sous Objective-C, le nom contient un préfixe à trois lettres, tel que la convention dans la programmation Objective-C. L'exemple suivant expose la méthode de valeur de l'attribut activé dans ExampleClass à Objective-C. Le nom est isEnabled au lieu de son nom d'attribut d'origine.

classe ExampleClass: NSObject {@objc var activé: Bool {@objc (isEnabled) get {// retourne la valeur appropriée}}} objcMembers

Cette fonctionnalité est utilisée dans les déclarations de classe pour appliquer la fonction objc à tous les membres compatibles Objective-C de cette classe, extensions, sous-classes et extensions de sous-classe.

La plupart du code devrait utiliser la fonction objc pour exposer la déclaration requise. Si vous devez exposer plusieurs déclarations, vous pouvez les regrouper en extensions qui ajoutent la fonction objc. La fonction objcMembers facilite un grand nombre de bibliothèques qui utilisent les outils d'introspection du runtime Objective-C. L'ajout de fonctionnalités objc inutiles augmentera le volume binaire et affectera les performances.

requires_stored_property_inits

Cette fonctionnalité est utilisée dans les déclarations de classe pour exiger que toutes les propriétés stockées dans la classe fournissent des valeurs par défaut dans le cadre de leur définition. L'attribut NSManagedObject est déduit pour toute classe héritée de celui-ci.

testable

Cette fonctionnalité est utilisée pour modifier l'instruction d'importation lors de l'importation de modules de compilation qui permettent les tests, afin que toutes les entités marquées d'un modificateur de niveau d'accès interne dans le module importé soient accessibles comme si elles étaient marquées avec un modificateur de niveau d'accès public. Les tests peuvent également accéder aux classes et aux membres de classe marqués avec des modificateurs de niveau d'accès internes ou publics, comme s'ils étaient déclarés avec des modificateurs d'accès ouvert.

UIApplicationMain

L'utilisation de cette fonctionnalité sur une classe indique que la classe est une classe déléguée d'application. L'utilisation de cette fonctionnalité a le même effet que d'appeler la fonction UIApplicationMain et de transmettre le nom de classe comme nom de classe délégué à la fonction.

Si vous ne souhaitez pas utiliser cette fonction, vous pouvez fournir un fichier main.swift et appelez UIApplicationMain (niveau supérieur de code : : : :) fonction. Par exemple, si votre application utilise une coutume héritée de la sous-classe UIApplication comme la classe principale, vous pouvez appeler le UIApplicationMain ( : : : :) fonction au lieu d'utiliser cette fonction.

usableFromInline

Cette fonction est utilisée dans la déclaration de fonctions, méthodes, propriétés calculées, indices, constructeurs ou destructeurs pour permettre au symbole d'être utilisé pour la déclaration de code en ligne dans le même module. La déclaration doit avoir un modificateur de niveau d'accès interne.

Comme le modificateur d'accès public, cette fonctionnalité expose la déclaration dans le cadre de l'interface publique du module. Contrairement à public, le compilateur n'autorise pas le code en dehors du module à faire référence à la déclaration de la balise usableFromInline par son nom, même si le symbole de déclaration est exporté, il ne peut pas être référencé. Cependant, le code en dehors du module peut toujours échanger des symboles de déclaration via le runtime.

Les déclarations marquées comme inlinables peuvent être utilisées implicitement dans le code en ligne. Bien que inlinable ou usableFromInline puissent être utilisés pour des déclarations internes, ils ne peuvent pas être utilisés en même temps.

warn_unqualified_access

Cette fonctionnalité s'applique aux fonctions de niveau supérieur, aux méthodes d'instance, aux méthodes de classe ou aux méthodes statiques pour déclencher un avertissement lorsque la fonction ou la méthode est utilisée sans qualificatif précédent (comme un nom de module, un nom de type, une variable d'instance ou une constante). L'utilisation de cette fonctionnalité peut aider à réduire l'ambiguïté dans l'accès aux fonctions du même nom dans le même rôle.

Par exemple, la bibliothèque standard Swift comprend des fonctions de niveau supérieur min ( : :) et des méthodes min () pour les éléments de comparaison de séquence. La déclaration de méthode de séquence utilise warn_unqualified_access pour réduire l'ambiguïté de leur utilisation dans les extensions de séquence.

Fonctions déclaratives utilisées par Interface Builder

La fonction Interface Builder est une fonction déclarative utilisée par Interface Builder pour se synchroniser avec Xcode. Swift fournit les fonctionnalités d'Interface Builder suivantes: IBAction, IBSegueAction, IBOutlet, IBDesignable et IBInspectable. Ces fonctionnalités sont conceptuellement les mêmes que les fonctionnalités correspondantes dans Objective-C.

IBOutlet et IBInspectable sont utilisés pour décorer la déclaration d'attribut d'une classe, la fonction IBAction est utilisée pour décorer la déclaration de méthode d'une classe et IBDesignable est utilisé pour décorer la déclaration de la classe.

Appliquer des fonctionnalités IBAction, IBSegueAction, IBOutlet, IBDesignable ou IBInspectable signifie toutes appliquer des fonctionnalités objc en même temps.

Caractéristiques du type

Les caractéristiques de type ne peuvent être utilisées que pour modifier des types.

autoclose

Cette fonctionnalité retarde l'évaluation de l'expression en encapsulant automatiquement l'expression dans une fermeture sans paramètre. Il peut modifier les paramètres de fonction de type type de fonction sans paramètre qui renvoie le type de résultat de l'expression. Pour obtenir des exemples d'utilisation de la fonction de fermeture automatique, voir Fermetures automatiques et types de fonctions.

convention

Cette fonctionnalité est utilisée pour modifier le type de fonction, elle rappelle la convention d'appel de fonction.

La fonction de convention apparaît toujours avec l'un des paramètres suivants.

Le paramètre swift est utilisé pour représenter une référence de fonction Swift. Il s'agit de la convention d'appel standard pour les valeurs de fonction dans Swift.

Le paramètre de bloc est utilisé pour indiquer une référence de bloc compatible Objective-C. La valeur de la fonction est utilisée comme référence à un objet bloc. Le bloc est un objet Objective-C compatible avec l'ID dans lequel la fonction appelante est intégrée. La fonction appelante utilise la convention d'appel de C.

Le paramètre c est utilisé pour représenter une référence de fonction C. La valeur de la fonction n'a pas de contexte ni de fonction de capture et utilise également la convention d'appel C.

Les fonctions utilisant la convention d'appel de fonction C peuvent également être utilisées en tant que fonctions utilisant la convention d'appel de bloc Objective-C, et les fonctions utilisant la convention d'appel de bloc Objective-C peuvent également être utilisées comme fonctions utilisant la convention d'appel de fonction Swift. Cependant, seules les fonctions globales non génériques, les fonctions locales et les fermetures qui ne capturent aucune variable locale peuvent être utilisées comme fonctions à l'aide de la convention d'appel de fonction C.

s'échapper

Utilisez cette fonctionnalité dans les déclarations de fonction ou de méthode, ce qui signifie que les paramètres ne seront pas stockés pour une exécution retardée, ce qui garantira que les paramètres ne dépasseront pas le cycle de vie de l'appel de fonction. Il n'est pas nécessaire d'utiliser explicitement self lors de l'accès aux propriétés et méthodes dans les types de fonctions qui utilisent l'échappement pour déclarer des fonctionnalités.

Je suppose que tu aimes

Origine www.cnblogs.com/liuxiaokun/p/12684726.html
conseillé
Classement