Использовать ли var или let при создании экземпляров в Swift?

Что следует использовать для создания экземпляров классов в Swift и почему?

пожалуйста, объясните использование let и var во время создания экземпляров в Swift

ниже приведен код: -

class ConstantTest{
    let constant: String
    init(constant: String) {
        self.constant = constant
    }
    func printConstant() {
        print(constant)
    }
}

let constanttest = ConstantTest(constant: "Hello")
constanttest.printConstant()

var test = ConstantTest(constant: "Hie")
test.printConstant()

person Community    schedule 15.03.2017    source источник


Ответы (2)


Используйте let, если:

  • это константа (или в случае ссылочных типов, таких как class, если ссылка не может быть заменена другой ссылкой); а также
  • вы можете установить его во время процесса инициализации.

Но если вам нужно иметь возможность изменить его позже, используйте var, например, истинные переменные, значения которых не являются постоянными (или в случае ссылочных типов, если вам нужно заменить его другим экземпляром). А вот переменные и свойства, значения которых не устанавливаются в процессе инициализации, приходится использовать var. Например, для lazy сохраненных свойств используется var, поскольку их значение устанавливается не после завершения процесса инициализации, а только при первой ссылке на него. Другой пример включает в себя ссылки контроллеров представлений на их выходы, которые подключаются только тогда, когда иерархия представлений создается на более позднем этапе.

Излишне говорить, что вычисляемые свойства также используют var.

Но если вы можете использовать let, вы должны это сделать, так как легче написать безопасный код, если вы знаете, что такое константа и что такое переменная. В вашем примере вы должны использовать let.

Примечание. В случае ссылочных типов, таких как типы class, let не означает, что сам объект обязательно является неизменным, просто вы не можете заменить его другим экземпляром. Если вы хотите контролировать, является ли он неизменным или нет, рассмотрите возможность использования типа значения (например, struct).


Позвольте мне посмотреть, смогу ли я сделать это последнее замечание более ясным. Рассмотреть возможность:

class Foo {
    var value: String
    init(value: String) {
        self.value = value
    }
}

Тогда разрешается:

let obj = Foo(value: "a")
obj.value = "b"           // changing mutable property of reference type, Foo, is permitted

Но нет следующего:

let obj = Foo(value: "a")
obj = Foo(value: "b")     // replacing `obj` with a new instance of `Foo`, is not

Если вы не хотите иметь возможность изменять свойство value, вы можете определить value как неизменяемое (или, по крайней мере, не изменяемое публично), например:

class Foo {
    let value: String      // or `private(set) var value: String`
    init(value: String) {
        self.value = value
    }
}

Или не определяйте Foo как class (ссылочный тип), а вместо этого определяйте его как struct (тип значения):

struct Foo {
    var value: String
    init(value: String) {
        self.value = value
    }
}

let obj = Foo(value: "a")
obj.value = "b"            // this is not permitted, because Foo value-type, `obj`, was declared with `let`, making it immutable

Обратите внимание, что в последнем примере объявление Foo в качестве типа значения (a struct) существенно меняет его, например.

var obj1 = Foo(value: "a")
var obj2 = obj1            // this value is a copy of `obj1` not a reference to the same object that `obj1` pointed to
obj1.value = "b"
print("\(obj1.value)")     // will print "b"
print("\(obj2.value)")     // will print "a"

Но типы значений, хотя для их использования требуется несколько иной образ мышления, невероятно полезны для простого написания безопасного кода. См. WWDC 2015 Создание лучших приложений с помощью типов значений в Swift.

person Rob    schedule 15.03.2017
comment
Спасибо @Rob, но я сомневаюсь, что экземпляры класса должны создаваться с var или пусть константой и почему? - person ; 15.03.2017
comment
Правило то же. Используйте let, если вам не нужно использовать var. если вы используете let, вы явно указываете, что эта ссылка не может быть заменена другой. (Очевидно, что это ничего не говорит о том, является ли объект изменчивым или нет... рассмотрите возможность использования типа значения, т.е. struct для этого.) - person Rob; 15.03.2017
comment
Я попытался назначить экземпляр let новому экземпляру var и не получил ошибки, даже если мне удалось изменить значение после изменения свойства класса на var. var testnew = constanttest testnew.constant = "hey" print(testnew.constant - person ; 15.03.2017
comment
@abhinavjha - Да, это было мое последнее замечание. Обратите внимание: вы можете изменить constant не потому, что testnew было объявлено как var (это отвлекающий маневр), а просто потому, что независимо от того, используете ли вы let при определении obj в моем примере, если class было определено как изменяемое, используя let при создании экземпляра это меняет тот факт, что сам объект по-прежнему изменчив. Неизменен только указатель на него. Я добавил несколько фрагментов кода в конец моего вопроса, чтобы проиллюстрировать этот момент. Все это поведение меняется, если вы используете типы значений (например, struct). - person Rob; 16.03.2017

Существуют различные причины для использования каждого из них. Самый простой способ объяснить это состоит в том, что let предназначен для определения констант, а var — для определения переменных. При использовании let значение изменить нельзя. Поэтому в вашем приложении, если вам нужно значение, которое можно изменить, используйте var. Также вы можете подумать о поиске своего ответа, так как есть много дубликатов этого вопроса.

Источник: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html

person Cameron    schedule 15.03.2017
comment
На самом деле я не понимаю, какую разницу мы получим при создании экземпляров с помощью var или let. Я знаю о var и позволяю функциональности для свойств класса и т. д. - person ; 15.03.2017
comment
Использование let в этой ситуации было бы правильным в соответствии с моим минимальным пониманием Swift, поскольку экземпляр типа никогда не меняется. Однако, если вам нужно заменить этот экземпляр новым, использование let неприменимо. Так что, если вам нужно это сделать, это будет var. constanttest = ConstantTest(constant: "new test") - person Cameron; 15.03.2017
comment
Я попытался назначить экземпляр let новому экземпляру var и не получил ошибки, даже если мне удалось изменить значение после изменения свойства класса на var. @Rob (ПРИМЕЧАНИЕ: я сомневаюсь, что экземпляры должны создаваться с константой var или let) var testnew = constanttest testnew.constant = "hey" print(testnew.constant) - person ; 15.03.2017