В чем разница между свойством и переменной в 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)")
        }
    }
}

[Переменная Java, свойство...]

Другие вопросы по тегам