В чем разница между свойством и переменной в Swift?
Из нескольких начальных уроков я вижу, что свойства принадлежат классу и, по сути, являются "глобальными переменными", как они используются в мире C++ (написано это много лет назад). Я также вижу переменные как больше "локальных" сущностей, которые используют / хранят информацию только внутри метода.
Затем я наткнулся на эту ветку Quora: https://www.quora.com/Apple-Swift-programming-language/What-is-the-difference-between-a-property-and-a-variable Теперь я вижу, что свойства в состоянии выполнить код, связанный с их вызовом. Это очень круто, но и открыло для меня кучу других вопросов.
Существуют ли другие простые и понятные способы запоминания различия между свойством и переменной?
2 ответа
Локальные переменные - это просто вещи, с которыми вы работаете. Вы имеете полный контроль над ними, и если вы измените переменную в функции, ничего за пределами вашей функции никогда не узнает. Если я напишу фреймворк, а вы его используете, и я решу что-то изменить в локальных переменных функции, ваше приложение, использующее мой фреймворк, продолжит работать, как будто ничего не изменилось.
Классы, с другой стороны, описывают контракт. Когда вы используете класс, у вас есть доступ ко всему, что они публично рекламируют. Это означает, что если я напишу фреймворк, а вы используете его, если я когда-либо изменю или удалю открытый член в классе, ваш код будет поврежден, если вы ранее использовали этот член.
По этой причине во многих языках плохая практика - помечать переменные экземпляра как общедоступные. Переменные экземпляра без присоединенной логики, если я хочу в какой-то момент инициировать что-либо при изменении поля или если я хочу полностью удалить поле (и вместо этого сообщить значение в подобъекте или чем-то еще), то я застрял с изменением государственного контракта (превращение поля в пару get
/set
методы, например), и, возможно, взломать ваш код.
По этой причине Swift делает свойства косвенным. Свойства Swift по большей части могут рассматриваться как немые значения, но если вам когда-либо понадобится перейти от сохраненного значения к вычисленному значению или чему-то еще, вы можете сделать это без изменения интерфейса вашего класса. Таким образом, вы не нарушаете существующий код, который опирается на свойство.
Свойства принадлежат объекту, а переменные - нет. Переменная может быть объявлена без привязки к определенному классу или другому объекту. Свойство должно быть связано с конкретным объектом (т. Е. Классом, перечислением или структурой)
variable
- именованное хранилище адреса. Каждая переменная имеет тип, который определяет размер памяти, атрибуты и поведение.
Swift переменная и константы
constant
это variable
но не может быть изменен после определения.
//definition
var <name> = <initial_value>
//type annotation
var <name>: <Swift_type> [= <initial_value>] // [] is optional
//var - variable
var myVariable1 = 11
var myVariable2: Int
myVariable2 = 12
//let - constant
let myConstant1 = 21
let myConstant2: Int
myConstant2 = 22
Глобальная и локальная переменная
Глобальная переменная - это переменная, которая определяется вне функции, класса. Локальная переменная: переменная внутри контекста типа (class, struct, enum) [About], внутри функции, параметр функции
Свойство [Наследование]
property
- связать значение с контекстом типа. Это переменная + ограниченнаяgetter/setter
Сохраненные свойства и вычисленные свойства
Они могут принадлежать экземпляру (instance property
) или введите (type property
):Stored property
(класс, структура)Computed property
(класс, структура, перечисление)
Stored property
- это local variable
-> переменная внутри контекста типа. Сохраненное свойство Swift не поддерживаетinstance variable
как Objective-C.
- переменные сохраненные свойства -
var
- постоянные сохраненные свойства -
let
Он поддерживает property observers
(willSet
, didSet
)
closure stored property
- настройка значения [Пример]
Computed property
- предоставлять getter
и необязательно setter
вычислять значение каждый раз
public class Person {
var firstName = "John"
var lastName = "Wick"
var fullNameComputedProperty: String {
get {
return "\(firstName) \(lastName)"
}
//optional
set {
let arr = newValue.split(separator: " ")
firstName = String(arr[0])
lastName = String(arr[1])
}
}
var addressStoredProperty: String {
//Property Observers
willSet {
print("old address:\(addressStoredProperty)")
print("new address:\(newValue)")
//addressStoredProperty is not updated yet
}
didSet {
print("old address:\(oldValue)")
print("new address:\(addressStoredProperty)")
}
}
}