Язык Swift 4 предоставляет свойства для класса, перечисления или структуры для сопоставления значений. Свойства могут быть далее классифицированы на Сохраненные свойства и Вычисленные свойства.
Разница между сохраненными свойствами и вычисленными свойствами
Сохраненная собственность | Компьютерная собственность |
---|---|
Сохраняйте значения констант и переменных как экземпляр | Рассчитать значение, а не хранить значение |
Предоставляется классами и структурами | Предоставляется классами, перечислениями и структурами |
Свойства Stored и Computed связаны с типом экземпляров. Когда свойства связаны со значениями его типа, тогда он определяется как «Свойства типа». Сохраненные и вычисляемые свойства обычно связаны с экземплярами определенного типа. Однако свойства также могут быть связаны с самим типом. Такие свойства известны как свойства типа. Наблюдатели за недвижимостью также используются
- Соблюдать значение хранимых свойств
- Соблюдать свойство унаследованного подкласса, производного от суперкласса
Сохраненные Свойства
Swift 4 представляет концепцию Stored Property для хранения экземпляров констант и переменных. Хранимые свойства констант определяются ключевым словом ‘let’, а Хранимые свойства переменных определяются ключевым словом ‘var’.
- Во время определения хранимое свойство предоставляет «значение по умолчанию»
- Во время инициализации пользователь может инициализировать и изменить начальные значения
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.
Другой способ сохранить сохраненное свойство — иметь постоянные структуры. Таким образом, весь экземпляр структуры будет рассматриваться как «сохраненные свойства констант».
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 используются —
- Отложить создание объекта.
- Когда свойство зависит от других частей класса, которые еще не известны
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 объединяет обе эти концепции в единую декларацию «хранимого свойства». Вместо соответствующей переменной экземпляра и резервного значения «хранимое свойство» содержит всю интегрированную информацию, определенную в одном месте о свойстве переменных по имени переменной, типу данных и функциям управления памятью.
Вычисленные свойства
Вместо того, чтобы хранить значения, вычисленные свойства предоставляют геттер и опциональный сеттер для косвенного извлечения и установки других свойств и значений.
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
Когда вычисляемое свойство оставило новое значение как неопределенное, для этой конкретной переменной будет установлено значение по умолчанию.
Вычисляемые свойства как свойства только для чтения
Свойство только для чтения в вычисляемом свойстве определяется как свойство с геттером, но без сеттера. Он всегда используется для возврата значения. Доступ к переменным осуществляется через «.» Синтаксис, но нельзя установить другое значение.
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 не могут быть вызваны.
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 } }
Запрос и установка свойств
Так же, как свойства экземпляра Свойства типа запрашиваются и устанавливаются с помощью «.» Синтаксис только для одного типа вместо указания на экземпляр.
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)
Когда мы запускаем вышеуказанную программу, используя площадку, мы получаем следующий результат —