Учебники

Свифт — Недвижимость

Язык Swift 4 предоставляет свойства для класса, перечисления или структуры для сопоставления значений. Свойства могут быть далее классифицированы на Сохраненные свойства и Вычисленные свойства.

Разница между сохраненными свойствами и вычисленными свойствами

Сохраненная собственность Компьютерная собственность
Сохраняйте значения констант и переменных как экземпляр Рассчитать значение, а не хранить значение
Предоставляется классами и структурами Предоставляется классами, перечислениями и структурами

Свойства Stored и Computed связаны с типом экземпляров. Когда свойства связаны со значениями его типа, тогда он определяется как «Свойства типа». Сохраненные и вычисляемые свойства обычно связаны с экземплярами определенного типа. Однако свойства также могут быть связаны с самим типом. Такие свойства известны как свойства типа. Наблюдатели за недвижимостью также используются

  • Соблюдать значение хранимых свойств
  • Соблюдать свойство унаследованного подкласса, производного от суперкласса

Сохраненные Свойства

Swift 4 представляет концепцию Stored Property для хранения экземпляров констант и переменных. Хранимые свойства констант определяются ключевым словом ‘let’, а Хранимые свойства переменных определяются ключевым словом ‘var’.

  • Во время определения хранимое свойство предоставляет «значение по умолчанию»
  • Во время инициализации пользователь может инициализировать и изменить начальные значения

Live Demo

struct Number {
   var digits: Int
   let pi = 3.1415
}

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

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

Когда мы запускаем вышеуказанную программу, используя площадку, мы получаем следующий результат —

67
3.1415

Рассмотрим следующую строку в приведенном выше коде —

let pi = 3.1415

Здесь переменная pi инициализируется как значение сохраненного свойства с экземпляром pi = 3.1415. Таким образом, всякий раз, когда экземпляр ссылается, он будет содержать значение только 3.1415.

Другой способ сохранить сохраненное свойство — иметь постоянные структуры. Таким образом, весь экземпляр структуры будет рассматриваться как «сохраненные свойства констант».

Live Demo

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

Когда мы запускаем вышеуказанную программу, используя площадку, мы получаем следующий результат —

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

Вместо повторной инициализации «числа» до 8,7 он вернет сообщение об ошибке, указывающее, что «число» объявлено как константа.

Ленивое Хранение Собственности

Swift 4 предоставляет гибкое свойство, называемое «Lazy Stored Property», где он не будет вычислять начальные значения, когда переменная инициализируется в первый раз. Модификатор ‘lazy’ используется перед объявлением переменной, чтобы иметь его в качестве сохраненного свойства lazy.

Lazy Properties используются —

  • Отложить создание объекта.
  • Когда свойство зависит от других частей класса, которые еще не известны

Live Demo

class sample {
   lazy var no = number()    // `var` declaration is required.
}

class number {
   var name = "Swift 4"
}

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

Когда мы запускаем вышеуказанную программу, используя площадку, мы получаем следующий результат —

Swift 4

Переменные экземпляра

В Цели C сохраненные свойства также имеют переменные экземпляра для целей резервного копирования, чтобы хранить значения, объявленные в хранимом свойстве.

Swift 4 объединяет обе эти концепции в единую декларацию «хранимого свойства». Вместо соответствующей переменной экземпляра и резервного значения «хранимое свойство» содержит всю интегрированную информацию, определенную в одном месте о свойстве переменных по имени переменной, типу данных и функциям управления памятью.

Вычисленные свойства

Вместо того, чтобы хранить значения, вычисленные свойства предоставляют геттер и опциональный сеттер для косвенного извлечения и установки других свойств и значений.

Live Demo

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)

Когда мы запускаем вышеуказанную программу, используя площадку, мы получаем следующий результат —

(150.0, 75.0)
-150.0
-65.0

Когда вычисляемое свойство оставило новое значение как неопределенное, для этой конкретной переменной будет установлено значение по умолчанию.

Вычисляемые свойства как свойства только для чтения

Свойство только для чтения в вычисляемом свойстве определяется как свойство с геттером, но без сеттера. Он всегда используется для возврата значения. Доступ к переменным осуществляется через «.» Синтаксис, но нельзя установить другое значение.

Live Demo

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

Когда мы запускаем вышеуказанную программу, используя площадку, мы получаем следующий результат —

Swift 4 Properties
3.09

Вычисленные свойства как наблюдатели свойств

В Swift 4 для наблюдения и реагирования на значения свойств используются Обозреватели свойств. Каждый раз, когда устанавливаются значения свойств, вызываются наблюдатели свойств. За исключением ленивых хранимых свойств, мы можем добавить наблюдатели свойства к «унаследованному» свойству методом «переопределение».

Обозреватели свойств могут быть определены

  • Перед сохранением значения — завещание

  • После сохранения нового значения — didset

  • Когда свойство установлено в инициализаторе, будет установлено, и наблюдатели didset не могут быть вызваны.

Перед сохранением значения — завещание

После сохранения нового значения — didset

Когда свойство установлено в инициализаторе, будет установлено, и наблюдатели didset не могут быть вызваны.

Live Demo

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

Когда мы запускаем вышеуказанную программу, используя площадку, мы получаем следующий результат —

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

Локальные и глобальные переменные

Локальные и глобальные переменные объявляются для вычисления и наблюдения свойств.

Локальные переменные Глобальные переменные
Переменные, которые определены в контексте функции, метода или замыкания. Переменные, которые определены вне контекста функции, метода, замыкания или типа.
Используется для хранения и получения значений. Используется для хранения и получения значений.
Сохраненные свойства используются для получения и установки значений. Сохраненные свойства используются для получения и установки значений.
Вычисленные свойства также используются. Вычисленные свойства также используются.

Тип недвижимости

Свойства определены в разделе Определение типа с помощью фигурных скобок {}, а область действия переменных также определена ранее. Для определения свойств типов для типов значений используется ключевое слово static, а для типов классов используется ключевое слово class.

Синтаксис

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

Запрос и установка свойств

Так же, как свойства экземпляра Свойства типа запрашиваются и устанавливаются с помощью «.» Синтаксис только для одного типа вместо указания на экземпляр.

Live Demo

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)

Когда мы запускаем вышеуказанную программу, используя площадку, мы получаем следующий результат —