Swift - Propiedades

El lenguaje Swift 4 proporciona propiedades de clase, enumeración o estructura para asociar valores. Las propiedades pueden clasificarse además en propiedades almacenadas y propiedades calculadas.

Diferencia entre propiedades almacenadas y propiedades calculadas

Propiedad almacenada Propiedad calculada
Almacene valores constantes y variables como instancia Calcule un valor en lugar de almacenar el valor
Proporcionado por clases y estructuras Proporcionado por clases, enumeraciones y estructuras

Tanto las propiedades almacenadas como las calculadas están asociadas con el tipo de instancias. Cuando las propiedades están asociadas con sus valores de tipo, se define como 'Propiedades de tipo'. Las propiedades almacenadas y calculadas generalmente se asocian con instancias de un tipo particular. Sin embargo, las propiedades también se pueden asociar con el tipo en sí. Estas propiedades se conocen como propiedades de tipo. También se utilizan observadores de propiedades

  • Para observar el valor de las propiedades almacenadas
  • Para observar la propiedad de la subclase heredada derivada de la superclase

Propiedades almacenadas

Swift 4 introduce el concepto de propiedad almacenada para almacenar las instancias de constantes y variables. Las propiedades almacenadas de las constantes se definen con la palabra clave 'let' y las propiedades almacenadas de las variables se definen con la palabra clave 'var'.

  • Durante la definición, la propiedad almacenada proporciona un 'valor predeterminado'
  • Durante la inicialización, el usuario puede inicializar y modificar los valores iniciales.
struct Number {
   var digits: Int
   let pi = 3.1415
}

var n = Number(digits: 12345)
n.digits = 67

print("\(n.digits)")
print("\(n.pi)")

Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:

67
3.1415

Considere la siguiente línea en el código anterior:

let pi = 3.1415

Aquí, la variable pi se inicializa como un valor de propiedad almacenado con la instancia pi = 3.1415. Por lo tanto, siempre que se haga referencia a la instancia, solo tendrá el valor 3.1415.

Otro método para tener una propiedad almacenada es tener estructuras constantes. Por tanto, la instancia completa de las estructuras se considerará como 'Propiedades almacenadas de constantes'.

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

Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:

error: cannot assign to 'numbers' in 'n'
n.numbers = 8.7

En lugar de reinicializar el 'número' a 8.7, devolverá un mensaje de error que indica que el 'número' se declara como constante.

Propiedad almacenada perezosa

Swift 4 proporciona una propiedad flexible llamada 'Propiedad almacenada diferida' donde no calculará los valores iniciales cuando la variable se inicialice por primera vez. El modificador 'lazy' se usa antes de la declaración de variable para tenerlo como una propiedad almacenada lazy.

Se utilizan propiedades perezosas -

  • Para retrasar la creación de objetos.
  • Cuando la propiedad depende de otras partes de una clase, que aún no se conocen
class sample {
   lazy var no = number()    // `var` declaration is required.
}

class number {
   var name = "Swift 4"
}

var firstsample = sample()
print(firstsample.no.name)

Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:

Swift 4

Variables de instancia

En Objective C, las propiedades almacenadas también tienen variables de instancia con fines de respaldo para almacenar los valores declarados en la propiedad almacenada.

Swift 4 integra ambos conceptos en una única declaración de "propiedad almacenada". En lugar de tener una variable de instancia correspondiente y un valor de respaldo, la 'propiedad almacenada' contiene toda la información integrada definida en una sola ubicación sobre la propiedad de las variables por nombre de variable, tipo de datos y funcionalidades de administración de memoria.

Propiedades calculadas

En lugar de almacenar los valores, las propiedades calculadas proporcionan un captador y un definidor opcional para recuperar y establecer otras propiedades y valores indirectamente.

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)

Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:

(150.0, 75.0)
-150.0
-65.0

Cuando una propiedad calculada deja el nuevo valor como indefinido, el valor predeterminado se establecerá para esa variable en particular.

Propiedades calculadas como propiedades de solo lectura

Una propiedad de solo lectura en la propiedad calculada se define como una propiedad con getter pero sin setter. Siempre se usa para devolver un valor. Además, se accede a las variables a través de un '.' Sintaxis pero no se puede establecer en otro valor.

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"]!)

Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:

Swift 4 Properties
3.09

Propiedades calculadas como observadores de propiedades

En Swift 4 para observar y responder a los valores de las propiedades, se utilizan Observadores de propiedades. Todas y cada una de las veces que se establecen los valores de las propiedades, se llama a los observadores de propiedades. Excepto las propiedades almacenadas diferidas, podemos agregar observadores de propiedades a la propiedad 'heredada' mediante el método 'invalidación'.

Los observadores de propiedades pueden definirse por

  • Antes de almacenar el valor - willset

  • Después de almacenar el nuevo valor - didset

  • Cuando se establece una propiedad en un inicializador willset y no se pueden llamar observadores 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

Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:

Total Counter is: 100
Newly Added Counter 100
Total Counter is: 800
Newly Added Counter 700

Variables locales y globales

Las variables locales y globales se declaran para calcular y observar las propiedades.

Variables locales Variables globales
Variables que se definen dentro de una función, método o contexto de cierre. Variables que se definen fuera del contexto de función, método, cierre o tipo.
Se utiliza para almacenar y recuperar valores. Se utiliza para almacenar y recuperar valores.
Las propiedades almacenadas se utilizan para obtener y establecer los valores. Las propiedades almacenadas se utilizan para obtener y establecer los valores.
También se utilizan propiedades calculadas. También se utilizan propiedades calculadas.

Propiedades de tipo

Las propiedades se definen en la sección Definición de tipo con llaves {} y el alcance de las variables también se definió previamente. Para definir las propiedades de tipo para los tipos de valor se utiliza la palabra clave 'estática' y para los tipos de clase se utiliza la palabra clave 'class'.

Sintaxis

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
   }
}

Consultar y configurar propiedades

Al igual que las propiedades de instancia, las propiedades de tipo se consultan y se establecen con '.' Sintaxis solo en el tipo en lugar de apuntar a la instancia.

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)

Cuando ejecutamos el programa anterior usando el patio de recreo, obtenemos el siguiente resultado:

97
87