Я изучаю Swift, и я читаю The Swift Programming Language
из Apple, у меня нет опыта Objective C (только PHP, JS и другие, но не Obj C)
На странице 24-25 я вижу этот код:
//...Class definition stuff...
var perimeter: Double {
get {
return 3.0 * sideLength
}
set {
sideLength = newValue / 3.0
}
}
//...Class continues...
Эта часть НЕ указана в книге, и я не могу понять, для чего они нужны.
Может ли кто-нибудь объяснить мне, что такое get и set ?
Ответы:
На самом деле это объясняется прямо перед кодом:
Когда какой-то другой класс хочет получить эту переменную периметра, они делают следующее:
... Что вызывает это:
По сути, это похоже на то, как если бы вызывающий контроллер сделал это:
Когда вы устанавливаете переменную из другого объекта, это выглядит так:
Что вызывает код в
set{}
блоке:И это как если бы класс, устанавливающий переменную, сделал это:
Это действительно просто для удобства - вы можете вызвать это из другого кода без необходимости постоянно делить или умножать на 3, потому что это делается прямо перед установкой переменной и прямо перед тем, как вы ее получите.
В Swift у нас могут быть свойства, которые вычисляются при получении и могут что-то делать при установке. Мы могли бы сделать это и в Objective-C:
источник
Получение и установка переменных в классах означает либо получение («получение»), либо изменение («установку») их содержимого.
Рассмотрим переменную
members
классаfamily
. Естественно, эта переменная должна быть целым числом, поскольку семья никогда не может состоять из двух или более человек.Итак, вы, вероятно, определили бы
members
переменную следующим образом:Это, однако, даст людям, использующим этот класс, возможность установить количество членов семьи примерно на 0 или 1. И поскольку не существует такой вещи, как семья из 1 или 0, это весьма прискорбно.
Вот тут-то и пригодятся геттеры и сеттеры. Таким образом, вы можете решить для себя, как можно изменять переменные и какие значения они могут получать, а также решать, какой контент они возвращают.
Возвращаясь к нашему семейному классу, давайте убедимся, что никто не может установить
members
значение меньше 2:Теперь мы можем получить доступ к
members
переменной , как и прежде, набравinstanceOfFamily.members
, а благодаря функции сеттер, мы можем установить его значение , как и прежде, набрав, например:instanceOfFamily.members = 3
. Что изменилось, так это то, что мы больше не можем устанавливать для этой переменной значение меньше 2.Обратите внимание на введение
_members
переменной, которая является фактической переменной для хранения значения, которое мы установили с помощьюmembers
функции установки. Оригиналmembers
теперь стал вычисляемым свойством, что означает, что он действует только как интерфейс для работы с нашей фактической переменной.источник
members
==>count
,numberOfMembers
;var members : Set<Person>
??set (newVal) { ... }
, подразумевается newVal, так чтоset { _members = newVal }
это тоже правильно._members
должны быть закрытыми, иначе командаinstanceOfFamily._members=1
установилаinstanceOfFamily.members
бы значение ниже 2newValue
в Swift 4 - docs.swift.org/swift-book/LanguageGuide/Properties.html#ID260За простым вопросом должен следовать короткий, простой и ясный ответ.
Когда мы получаем значение свойства, оно запускает свою
get{}
часть.Когда мы устанавливаем значение для свойства, оно запускает свою
set{}
часть.PS. При установке значения для свойства SWIFT автоматически создает константу с именем «newValue» = значение, которое мы устанавливаем. После того, как в части свойства становится доступной константа newValue
set{}
.Пример:
источник
Вы должны посмотреть на вычисленные свойства
В вашем примере кода
perimeter
это свойство, не поддерживаемое переменной класса, вместо этого его значение вычисляется с использованиемget
метода и сохраняется с помощьюset
метода, обычно называемого получателем и установщиком .Когда вы используете это свойство следующим образом:
вы вызываете код, содержащийся в
get
блоке кода, и когда вы используете его следующим образом:вы вызываете код, содержащийся в
set
блоке кода,newValue
который автоматически заполняется значением, указанным справа от оператора присваивания.Вычисляемые свойства могут быть доступны для чтения и записи, если указаны оба метода получения и установки, или только для чтения, если указан только метод получения.
источник
переменная объявляет и вызывает такой же вызов в классе
Теперь вы хотите, чтобы программа сделала значение x по умолчанию больше или равным 3. Теперь рассмотрим гипотетический случай, если x меньше 3, ваша программа завершится ошибкой. Итак, вы хотите, чтобы люди ставили 3 или более 3. Swift упростил вам задачу, и важно понимать этот прогрессивный способ датировки значения переменной, потому что они будут широко использоваться при разработке iOS. Теперь посмотрим, как здесь будут использоваться get и set.
если у вас все еще есть сомнения, просто помните, что использование get и set заключается в обновлении любой переменной так, как мы хотим, чтобы она обновлялась. get and set даст вам лучший контроль над вашей логикой. Мощный инструмент, следовательно, непонятен.
источник