Swift - Proprietà
Il linguaggio Swift 4 fornisce proprietà per classe, enumerazione o struttura per associare valori. Le proprietà possono essere ulteriormente classificate in Proprietà memorizzate e Proprietà calcolate.
Differenza tra proprietà memorizzate e proprietà calcolate
Proprietà immagazzinata | Proprietà calcolata |
---|---|
Memorizza valori costanti e variabili come istanza | Calcola un valore anziché archiviarlo |
Fornito da classi e strutture | Fornito da classi, enumerazioni e strutture |
Entrambe le proprietà Stored e Computed sono associate al tipo di istanza. Quando le proprietà sono associate ai valori del tipo, viene definito come "Proprietà del tipo". Le proprietà memorizzate e calcolate sono generalmente associate a istanze di un tipo particolare. Tuttavia, le proprietà possono anche essere associate al tipo stesso. Tali proprietà sono note come proprietà del tipo. Vengono utilizzati anche osservatori di proprietà
- Per osservare il valore delle proprietà memorizzate
- Per osservare la proprietà della sottoclasse ereditata derivata dalla superclasse
Proprietà memorizzate
Swift 4 introduce il concetto di proprietà memorizzata per memorizzare le istanze di costanti e variabili. Le proprietà memorizzate delle costanti sono definite dalla parola chiave "let" e le proprietà memorizzate delle variabili sono definite dalla parola chiave "var".
- Durante la definizione, la proprietà memorizzata fornisce il "valore predefinito"
- Durante l'inizializzazione l'utente può inizializzare e modificare i valori iniziali
struct Number {
var digits: Int
let pi = 3.1415
}
var n = Number(digits: 12345)
n.digits = 67
print("\(n.digits)")
print("\(n.pi)")
Quando eseguiamo il programma precedente usando playground, otteniamo il seguente risultato:
67
3.1415
Considera la seguente riga nel codice sopra:
let pi = 3.1415
Qui, la variabile pi viene inizializzata come valore di proprietà memorizzato con l'istanza pi = 3.1415. Quindi, ogni volta che l'istanza viene riferita, manterrà solo il valore 3,1415.
Un altro metodo per avere proprietà memorizzate è avere strutture costanti. Quindi l'intera istanza delle strutture verrà considerata come "Proprietà memorizzate delle costanti".
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
Quando eseguiamo il programma precedente usando playground, otteniamo il seguente risultato:
error: cannot assign to 'numbers' in 'n'
n.numbers = 8.7
Invece di reinizializzare il "numero" a 8.7, restituirà un messaggio di errore che indica che il "numero" è dichiarato come costante.
Proprietà immagazzinata pigra
Swift 4 fornisce una proprietà flessibile chiamata "Proprietà memorizzata pigra" in cui non calcolerà i valori iniziali quando la variabile viene inizializzata per la prima volta. Il modificatore "pigro" viene utilizzato prima della dichiarazione della variabile per averla come proprietà memorizzata in modo pigro.
Vengono utilizzate le proprietà pigre:
- Per ritardare la creazione di oggetti.
- Quando la proprietà dipende da altre parti di una classe, che non sono ancora note
class sample {
lazy var no = number() // `var` declaration is required.
}
class number {
var name = "Swift 4"
}
var firstsample = sample()
print(firstsample.no.name)
Quando eseguiamo il programma precedente usando playground, otteniamo il seguente risultato:
Swift 4
Variabili di istanza
In Objective C, le proprietà memorizzate hanno anche variabili di istanza a scopo di backup per memorizzare i valori dichiarati nella proprietà memorizzata.
Swift 4 integra entrambi questi concetti in un'unica dichiarazione di "proprietà memorizzata". Invece di avere una variabile di istanza corrispondente e un valore di backup, la "proprietà memorizzata" contiene tutte le informazioni integrate definite in un'unica posizione sulla proprietà delle variabili in base al nome della variabile, al tipo di dati e alle funzionalità di gestione della memoria.
Proprietà calcolate
Piuttosto che memorizzare i valori, le proprietà calcolate forniscono un getter e un setter opzionale per recuperare e impostare altre proprietà e valori indirettamente.
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)
Quando eseguiamo il programma precedente usando playground, otteniamo il seguente risultato:
(150.0, 75.0)
-150.0
-65.0
Quando una proprietà calcolata lascia il nuovo valore come non definito, il valore predefinito verrà impostato per quella particolare variabile.
Proprietà calcolate come proprietà di sola lettura
Una proprietà di sola lettura nella proprietà calcolata è definita come una proprietà con getter ma senza setter. Viene sempre utilizzato per restituire un valore. Le variabili sono ulteriormente accessibili tramite un '.' Sintassi ma non può essere impostata su un altro valore.
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 4 Properties"
movie.duration = 3.09
print(movie.metaInfo["head"]!)
print(movie.metaInfo["duration"]!)
Quando eseguiamo il programma precedente usando playground, otteniamo il seguente risultato:
Swift 4 Properties
3.09
Proprietà calcolate come osservatori di proprietà
In Swift 4 per osservare e rispondere ai valori delle proprietà vengono utilizzati gli osservatori delle proprietà. Ogni volta che vengono impostati i valori delle proprietà vengono chiamati gli osservatori di proprietà. Ad eccezione delle proprietà memorizzate pigre, possiamo aggiungere osservatori di proprietà alla proprietà "ereditata" mediante il metodo "sovrascrittura".
Gli osservatori di proprietà possono essere definiti da entrambi
Prima di memorizzare il valore - willset
Dopo aver memorizzato il nuovo valore - didset
Quando una proprietà è impostata in un inizializzatore, non è possibile chiamare gli osservatori di set e didset.
class Samplepgm {
var counter: Int = 0 {
willSet(newTotal){
print("Total Counter is: \(newTotal)")
}
didSet {
if counter > oldValue {
print("Newly Added Counter \(counter - oldValue)")
}
}
}
}
let NewCounter = Samplepgm()
NewCounter.counter = 100
NewCounter.counter = 800
Quando eseguiamo il programma precedente usando playground, otteniamo il seguente risultato:
Total Counter is: 100
Newly Added Counter 100
Total Counter is: 800
Newly Added Counter 700
Variabili locali e globali
Le variabili locali e globali vengono dichiarate per il calcolo e l'osservazione delle proprietà.
Variabili locali | Variabili globali |
---|---|
Variabili definite all'interno di una funzione, un metodo o un contesto di chiusura. | Variabili definite al di fuori di funzione, metodo, chiusura o contesto di tipo. |
Utilizzato per memorizzare e recuperare i valori. | Utilizzato per memorizzare e recuperare i valori. |
Le proprietà memorizzate vengono utilizzate per ottenere e impostare i valori. | Le proprietà memorizzate vengono utilizzate per ottenere e impostare i valori. |
Vengono utilizzate anche le proprietà calcolate. | Vengono utilizzate anche le proprietà calcolate. |
Proprietà del tipo
Le proprietà sono definite nella sezione Definizione del tipo con parentesi graffe {} e anche l'ambito delle variabili è definito in precedenza. Per definire le proprietà del tipo per i tipi di valore viene utilizzata la parola chiave "statica" e per i tipi di classe viene utilizzata la parola chiave "classe".
Sintassi
struct Structname {
static var storedTypeProperty = " "
static var computedTypeProperty: Int {
// return an Int value here
}
}
enum Enumname {
static var storedTypeProperty = " "
static var computedTypeProperty: Int {
// return an Int value here
}
}
class Classname {
class var computedTypeProperty: Int {
// return an Int value here
}
}
Interrogazione e impostazione delle proprietà
Proprio come le proprietà dell'istanza, le proprietà del tipo vengono interrogate e impostate con "." Sintassi solo sul tipo invece di puntare all'istanza.
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)
Quando eseguiamo il programma precedente usando playground, otteniamo il seguente risultato:
97
87