Propriétés rapides
Les propriétés Swift associent des valeurs à une classe, une structure ou une énumération spécifique.
Les attributs peuvent être divisés en attributs stockés et attributs calculés :
存储属性 | 计算属性 |
---|---|
存储常量或变量作为实例的一部分 | 计算(而不是存储)一个值 |
用于类和结构体 | 用于类、结构体和枚举 |
Les propriétés stockées et les propriétés calculées sont généralement utilisées sur des instances de types spécifiques.
Les attributs peuvent également être utilisés directement sur le type lui-même. Ces attributs sont appelés attributs de type.
De plus, vous pouvez également définir des observateurs d'attributs pour surveiller les modifications des valeurs d'attribut afin de déclencher une opération personnalisée. Les observateurs de propriétés peuvent être ajoutés aux propriétés stockées écrites par vous-même ou aux propriétés héritées des classes parentes.
Propriétés stockées
En termes simples, une propriété stockée est une constante ou une variable stockée dans une instance d'une classe ou d'une structure spécifique.
Les attributs stockés peuvent être des attributs de stockage variables (définis avec le mot-clé var) ou des attributs de stockage constants (définis avec le mot-clé let).
Vous pouvez spécifier la valeur par défaut lors de la définition de l'attribut stocké
Vous pouvez également définir ou modifier la valeur de l'attribut stocké lors de la construction traiter, voire le modifier La valeur de l'attribut de stockage constant
import Cocoa struct Number { var digits: Int let pi = 3.1415 } var n = Number(digits: 12345) n.digits = 67 print("\(n.digits)") print("\(n.pi)")
Le résultat de sortie de l'exécution du programme ci-dessus est :
67 3.1415
Considérez le code suivant :
let pi = 3.1415
Dans le code, pi définit l'attribut de stockage, spécifiez une valeur par défaut (pi = 3,1415), donc peu importe le moment où vous instanciez la structure, elle ne changera pas.
Si vous définissez un attribut de stockage constant, une erreur sera signalée si vous essayez de le modifier, comme indiqué ci-dessous :
import Cocoa struct Number { var digits: Int let numbers = 3.1415 } var n = Number(digits: 12345) n.digits = 67 print("\(n.digits)") print("\(n.numbers)") n.numbers = 8.7
Lors de l'exécution du programme ci-dessus, une erreur sera signalée, et l'erreur sera la suivante :
error: cannot assign to property: 'numbers' is a 'let' constant n.numbers = 8.7
signifie que 'nombres' est une constante, vous ne pouvez pas le modifier.
Propriété de stockage paresseux
La propriété de stockage paresseux fait référence à une propriété dont la valeur initiale n'est pas calculée jusqu'à ce qu'elle soit appelée pour la première fois.
Utilisez lazy avant la déclaration d'attribut pour marquer un attribut de stockage paresseux.
Remarque :
Les propriétés de stockage paresseux doivent être déclarées en tant que variables (à l'aide du mot-clévar
) car la valeur de la propriété peut ne pas être disponible tant que la construction de l'instance n'est pas terminée. Les propriétés constantes doivent avoir une valeur initiale avant la fin du processus de construction, elles ne peuvent donc pas être déclarées comme propriétés retardées.
Les attributs de stockage différé sont généralement utilisés pour :
Création d'objets différés.
Lorsque la valeur d'un attribut dépend d'autres classes inconnues
import Cocoa class sample { lazy var no = number() // `var` 关键字是必须的 } class number { var name = "php Swift 教程" } var firstsample = sample() print(firstsample.no.name)
Le résultat de sortie de l'exécution du programme ci-dessus est :
php Swift 教程
Variables instanciées
Si vous avez de l'expérience avec Objective-C, sachez qu'Objective-C fournit deux méthodes pour stocker les valeurs et les références pour les instances de classe. Pour les propriétés, vous pouvez également utiliser des variables d'instance comme stockage principal pour les valeurs de propriété.
Dans le langage de programmation Swift, ces théories sont unifiées et implémentées à l'aide d'attributs. Les propriétés dans Swift n'ont pas de variables d'instance correspondantes et le stockage principal des propriétés n'est pas accessible directement. Cela évite les problèmes liés aux méthodes d'accès dans différents scénarios et simplifie également la définition des attributs en une seule instruction.
Toutes les informations sur les propriétés d'un type, y compris les caractéristiques de dénomination, de type et de gestion de la mémoire, sont définies à un seul endroit (dans la définition du type).
Propriétés calculées
En plus des propriétés stockées, les classes, les structures et les énumérations peuvent définir des Propriétés calculées Les propriétés calculées ne stockent pas directement les valeurs, mais fournissent un getter. . Obtient la valeur et un paramètre facultatif pour définir indirectement la valeur d'autres propriétés ou variables.
import Cocoa class sample { var no1 = 0.0, no2 = 0.0 var length = 300.0, breadth = 150.0 var middle: (Double, Double) { get{ return (length / 2, breadth / 2) } set(axis){ no1 = axis.0 - (length / 2) no2 = axis.1 - (breadth / 2) } } } var result = sample() print(result.middle) result.middle = (0.0, 10.0) print(result.no1) print(result.no2)
Le résultat de l'exécution du programme ci-dessus est :
(150.0, 75.0) -150.0 -65.0
Si le créateur de la propriété calculée ne définit pas de nom de paramètre représentant la nouvelle valeur, le nom par défaut newValue peut être utilisé.
Propriétés calculées en lecture seule
Une propriété calculée avec uniquement un getter et aucun setter est une propriété calculée en lecture seule.
Les propriétés calculées en lecture seule renvoient toujours une valeur et sont accessibles via l'opérateur point (.), mais une nouvelle valeur ne peut pas être définie.
import Cocoa class film { var head = "" var duration = 0.0 var metaInfo: [String:String] { return [ "head": self.head, "duration":"\(self.duration)" ] } } var movie = film() movie.head = "Swift 属性" movie.duration = 3.09 print(movie.metaInfo["head"]!) print(movie.metaInfo["duration"]!)
Le résultat de l'exécution du programme ci-dessus est :
Swift 属性 3.09
Remarque :
doit utiliser le mot-clé
var
pour définir les propriétés calculées, y compris en lecture seule. propriétés calculées, car Leurs valeurs ne sont pas fixes. Le mot-clélet
sert uniquement à déclarer des attributs constants, indiquant des valeurs non modifiables après l'initialisation.
Property Observer
Property Observer surveille et répond aux changements dans les valeurs de propriété. L'observateur de propriété est appelé chaque fois qu'une propriété est définie sur une valeur, même pour de nouvelles valeurs. . Cela ne fait pas exception lorsqu'elle est identique à la valeur actuelle.
Vous pouvez ajouter des observateurs de propriétés pour d'autres propriétés stockées, à l'exception des propriétés stockées paresseuses, et vous pouvez également ajouter des observateurs de propriétés pour les propriétés héritées (y compris les propriétés stockées et les propriétés calculées) en surchargeant les propriétés.
Remarque :
Il n'est pas nécessaire d'ajouter des observateurs de propriétés pour les propriétés calculées qui ne peuvent pas être surchargées, car les changements de valeur peuvent être surveillés et traités directement via les setters.
Vous pouvez ajouter un ou tous les observateurs suivants à une propriété :
willSet
Appelez < avant de définir un nouveau value 🎜>Invoqué immédiatement après la définition de la nouvelle valeur
didSet
- Les observateurs willSet et didSet ne seront pas appelés lors de l'initialisation de la propriété
import Cocoa class Samplepgm { var counter: Int = 0{ willSet(newTotal){ print("计数器: \(newTotal)") } didSet{ if counter > oldValue { print("新增数 \(counter - oldValue)") } } } } let NewCounter = Samplepgm() NewCounter.counter = 100 NewCounter.counter = 800Le résultat de l'exécution du programme ci-dessus est :
计数器: 100 新增数 100 计数器: 800 新增数 700
Variables globales et variables localesPropriétés calculées et observateurs de propriétés Le modèle décrit peut également être utilisé pour les variables globales et les variables locales .
Attributs de type
Les attributs de type sont écrits entre les accolades les plus extérieures ({}) du type dans le cadre de la définition du type.
Utilisez le mot-clé static pour définir les attributs de type pour les types valeur, et le mot-clé class pour définir les attributs de type pour les classes.
struct Structname { static var storedTypeProperty = " " static var computedTypeProperty: Int { // 这里返回一个 Int 值 } } enum Enumname { static var storedTypeProperty = " " static var computedTypeProperty: Int { // 这里返回一个 Int 值 } } class Classname { class var computedTypeProperty: Int { // 这里返回一个 Int 值 } }
Remarque :
Les propriétés de type calculées dans l'exemple sont en lecture seule, mais vous pouvez également définir des propriétés de type calculées lisibles et inscriptibles, similaires à la syntaxe des propriétés calculées d'instance.
Obtention et définition de la valeur des attributs de type
Semblables aux attributs d'instance, les attributs de type sont également accessibles via l'opérateur point (.). Cependant, les propriétés de type sont obtenues et définies via le type lui-même, et non via l'instance. L'exemple est le suivant :
import Cocoa struct StudMarks { static let markCount = 97 static var totalCount = 0 var InternalMarks: Int = 0 { didSet { if InternalMarks > StudMarks.markCount { InternalMarks = StudMarks.markCount } if InternalMarks > StudMarks.totalCount { StudMarks.totalCount = InternalMarks } } } } var stud1Mark1 = StudMarks() var stud1Mark2 = StudMarks() stud1Mark1.InternalMarks = 98 print(stud1Mark1.InternalMarks) stud1Mark2.InternalMarks = 87 print(stud1Mark2.InternalMarks)
Le résultat de sortie de l'exécution du programme ci-dessus est :
97 87