Swift - Propriedades

A linguagem Swift 4 fornece propriedades para classe, enumeração ou estrutura para associar valores. As propriedades podem ser classificadas em propriedades armazenadas e propriedades computadas.

Diferença entre propriedades armazenadas e propriedades computadas

Propriedade Armazenada Propriedade Computada
Armazene valores constantes e variáveis ​​como instância Calcule um valor em vez de armazená-lo
Fornecido por classes e estruturas Fornecido por classes, enumerações e estruturas

As propriedades Armazenadas e Computadas estão associadas ao tipo de instância. Quando as propriedades são associadas aos seus valores de tipo, ela é definida como 'Propriedades de tipo'. Propriedades armazenadas e calculadas geralmente são associadas a instâncias de um tipo específico. No entanto, as propriedades também podem ser associadas ao próprio tipo. Essas propriedades são conhecidas como propriedades de tipo. Observadores de propriedade também são usados

  • Para observar o valor das propriedades armazenadas
  • Para observar a propriedade da subclasse herdada derivada da superclasse

Propriedades Armazenadas

Swift 4 introduz o conceito de propriedade armazenada para armazenar as instâncias de constantes e variáveis. As propriedades armazenadas de constantes são definidas pela palavra-chave 'let' e as propriedades armazenadas de variáveis ​​são definidas pela palavra-chave 'var'.

  • Durante a definição, a propriedade armazenada fornece 'valor padrão'
  • Durante a inicialização, o usuário pode inicializar e modificar os valores iniciais
struct Number {
   var digits: Int
   let pi = 3.1415
}

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

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

Quando executamos o programa acima usando playground, obtemos o seguinte resultado -

67
3.1415

Considere a seguinte linha no código acima -

let pi = 3.1415

Aqui, a variável pi é inicializada como um valor de propriedade armazenado com a instância pi = 3,1415. Portanto, sempre que a instância for referenciada, ela conterá apenas o valor 3,1415.

Outro método para ter propriedades armazenadas é ter como estruturas constantes. Portanto, toda a instância das estruturas será considerada como 'Propriedades armazenadas das 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

Quando executamos o programa acima usando playground, obtemos o seguinte resultado -

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

Em vez de reinicializar o 'número' para 8,7, ele retornará uma mensagem de erro indicando que o 'número' é declarado como constante.

Propriedade Armazenada Preguiçosa

O Swift 4 fornece uma propriedade flexível chamada 'Lazy Stored Property' onde não calcula os valores iniciais quando a variável é inicializada pela primeira vez. O modificador 'preguiçoso' é usado antes da declaração da variável para tê-la como uma propriedade armazenada preguiçosa.

Propriedades preguiçosas são usadas -

  • Para atrasar a criação do objeto.
  • Quando a propriedade depende de outras partes de uma classe, que ainda não são conhecidas
class sample {
   lazy var no = number()    // `var` declaration is required.
}

class number {
   var name = "Swift 4"
}

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

Quando executamos o programa acima usando playground, obtemos o seguinte resultado -

Swift 4

Variáveis ​​de instância

Em Objective C, as propriedades armazenadas também têm variáveis ​​de instância para fins de backup para armazenar os valores declarados na propriedade armazenada.

O Swift 4 integra esses dois conceitos em uma única declaração de 'propriedade armazenada'. Em vez de ter uma variável de instância correspondente e valor de backup, a 'propriedade armazenada' contém todas as informações integradas definidas em um único local sobre a propriedade das variáveis ​​por nome de variável, tipo de dados e funcionalidades de gerenciamento de memória.

Propriedades Computadas

Em vez de armazenar os valores calculados, as propriedades fornecem um getter e um setter opcional para recuperar e definir outras propriedades e valores indiretamente.

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 executamos o programa acima usando playground, obtemos o seguinte resultado -

(150.0, 75.0)
-150.0
-65.0

Quando uma propriedade computada deixa o novo valor como indefinido, o valor padrão será definido para aquela variável particular.

Propriedades calculadas como propriedades somente leitura

Uma propriedade somente leitura na propriedade computada é definida como uma propriedade com getter, mas sem setter. É sempre usado para retornar um valor. As variáveis ​​são posteriormente acessadas por meio de um '.' Sintaxe, mas não pode ser definida para outro 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"]!)

Quando executamos o programa acima usando playground, obtemos o seguinte resultado -

Swift 4 Properties
3.09

Propriedades calculadas como observadores de propriedade

No Swift 4, para observar e responder aos valores das propriedades, são usados ​​Observadores de Propriedades. Sempre que os valores das propriedades são definidos, os observadores das propriedades são chamados. Exceto as propriedades lazy stored, podemos adicionar observadores de propriedade à propriedade 'herdada' pelo método 'override'.

Observadores de propriedade podem ser definidos por qualquer

  • Antes de armazenar o valor - willset

  • Depois de armazenar o novo valor - didset

  • Quando uma propriedade é definida em um inicializador, os observadores willset e didset não podem ser chamados.

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 executamos o programa acima usando playground, obtemos o seguinte resultado -

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

Variáveis ​​locais e globais

Variáveis ​​locais e globais são declaradas para calcular e observar as propriedades.

Variáveis ​​Locais Variáveis ​​globais
Variáveis ​​que são definidas em uma função, método ou contexto de fechamento. Variáveis ​​que são definidas fora do contexto de função, método, encerramento ou tipo.
Usado para armazenar e recuperar valores. Usado para armazenar e recuperar valores.
As propriedades armazenadas são usadas para obter e definir os valores. As propriedades armazenadas são usadas para obter e definir os valores.
Propriedades computadas também são usadas. Propriedades computadas também são usadas.

Propriedades de tipo

As propriedades são definidas na seção de definição de tipo com chaves {} e o escopo das variáveis ​​também é definido anteriormente. Para definir propriedades de tipo para tipos de valor, a palavra-chave 'estática' é usada e para tipos de classe, a palavra-chave 'classe' é usada.

Sintaxe

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

Consultando e definindo propriedades

Assim como as propriedades de instância, as propriedades de tipo são consultadas e definidas com '.' Sintaxe apenas no tipo em vez de apontar para a instância.

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 executamos o programa acima usando playground, obtemos o seguinte resultado -

97
87