Быстрая функция vs lazy var vs вычисляемое свойство - разница?

Есть ли разница между следующими:

Lazy variable:

lazy var profileImageIsLoaded : Bool = {
    return (profileImageView.image != nil) && (profileImageProgressView.alpha == 0.0)
}()

Функция:

func profileImageIsLoaded() -> Bool {
    return (profileImageView.image != nil) && (profileImageProgressView.alpha == 0.0)
}

Вычисленное свойство:

var profileImageIsLoaded : Bool {
    return (profileImageView.image != nil) && (profileImageProgressView.alpha == 0.0)
}

и какой метод лучше всего использовать?

Я бы назвал функцию/переменную несколько раз, поэтому мой вопрос заключается в том, обновлены ли ленивые вары или получают ли они только одно значение.

Ответ 1

  • lazy var - фактически сохраненные свойства, поэтому вы не можете помещать их в расширения или где-либо хранимые свойства не разрешены.
  • Геттер для вычисляемых свойств запускается каждый раз, когда вы ссылаетесь на это свойство. Это может быть значительным, особенно если геттер занимает много времени или имеет побочные эффекты для других частей кода.
  • Геттер для lazy var запускается только при первом упоминании свойства и никогда больше.
  • lazy var являются переменными. Вы можете их изменить.
  • Вычисленные свойства могут необязательно иметь сеттер, поэтому иногда они доступны только для чтения.
  • Использование подобной функции очень похоже на вычисляемое свойство только для чтения. Вам просто нужно добавить () при получении значения.

Ответ 2

Первый:

lazy var profileImageIsLoaded : Bool = {
    return (profileImageView.image != nil) && (profileImageProgressView.alpha == 0.0)
}()

profileImageIsLoaded - это хранимое свойство, которое инициализируется лениво, используя замыкание, после того как переменная была инициализирована, это закрытие больше не будет вызываться, и значение, которое оно получило при первом вызове, будет возвращено.

Второй:

func profileImageIsLoaded() -> Bool {
    return (profileImageView.image != nil) && (profileImageProgressView.alpha == 0.0)
}

Является объявлением нормальной функции, это только объявление. Если вы хотите вызвать эту функцию, вы сделаете так: profileImageIsLoaded().

Третий:

var profileImageIsLoaded : Bool {
    return (profileImageView.image != nil) && (profileImageProgressView.alpha == 0.0)
}

profileImageIsLoaded - вычисленное свойство, каждый раз, когда вы обращаетесь к этому свойству, он будет вычисляться и возвращаться.

Выбор того, который нужно использовать, всегда зависит от вашей ситуации.

Ответ 3

Может ли кто-нибудь объяснить больше, почему свойство lazy var profileImageIsLoaded хранится (не вычисляется)?!