Свойства класса Swift — требуется ли для этого инициализация?

#initialization #swift

#инициализация #swift

Вопрос:

 class Something {
    ...
}

class AnotherThing {

    let foo: Something

    init(something: Something) {
        foo = something
    }
}

class ReallyGreatClass {

    let aSomething = Something();
    let anotherThing = AnotherThing(something: aSomething);

}
  

ReallyGreatClass выдает следующую ошибку компилятора:

Действительно отличный класс.У типа нет элемента с именем ‘aSomething’

В главе об инициализации языка программирования Swift под подзаголовком Установка значения свойства по умолчанию с помощью замыкания или функции они отбрасывают концепцию инициализации значения свойства по умолчанию с помощью замыкания; так что давайте рассмотрим это:

 let anotherThing: AnotherThing = {
    return AnotherThing(something: aSomething)
}()
  

Ну, конечно, это не работает — это не предполагается. Как указано в главе:

Если вы используете замыкание для инициализации свойства, помните, что остальная часть экземпляра еще не была инициализирована в момент выполнения замыкания. Это означает, что вы не можете получить доступ к любым другим значениям свойств из вашего закрытия, даже если эти свойства имеют значения по умолчанию. Вы также не можете использовать неявное свойство self или вызывать какой-либо из методов экземпляра.

Итак, единственный способ, который я нашел для решения этой проблемы, — включить метод инициализатора:

 init() {
    anotherThing = AnotherThing(something: aSomething)
}
  

Но, кажется странным, что мне понадобится однострочный метод инициализации только для настройки anotherThing свойства. Мне интересно, не пропустил ли я что-то и есть ли способ установить значение свойства по умолчанию, не требуя инициализатора.

Ответ №1:

Вы ничего не пропустили. Если вы хотите использовать другое свойство при инициализации, вы должны использовать метод инициализации.