Захват свойства объекта для замыкания в Swift

Я переписываю некоторый код, чтобы добавлять задания в массив замыканий, а не выполнять их напрямую:

var someObject: SomeType?
var jobsArray: [() -> ()] = []

// before rewriting
doExpensiveOperation(someObject!.property)

// 1st attempt at rewriting
jobsArray.append {
    doExpensiveOperation(someObject!.property)
}

Однако, поскольку значение someObject может измениться до выполнения замыкания, теперь я добавляю список замыканий следующим образом:

// 2nd attempt at rewriting
jobsArray.append { [someObject] in
    doExpensiveOperation(someObject!.property)
}

Будем надеяться, что если, скажем, для свойства someObject будет установлено значение nil до того, как закрытие будет выполнено, замыкание все равно получит доступ к предполагаемому экземпляру.

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

// 3rd attempt at rewriting
let p = someObject!.property
jobsArray.append { 
    doExpensiveOperation(p)
}

Мне не очень нравится это решение, потому что оно означает изменение исходной строки кода. Я бы предпочел это, но это не работает:

// 4th attempt at rewriting
jobsArray.append { [someObject!.property] in
    doExpensiveOperation(someObject!.property)
}

Довольно новичок в Swift, поэтому все рекомендации были с благодарностью приняты. Спасибо!

@NRitH, это не массив, это список захвата. См. «Определение списка захвата» в docs.swift.org/swift-book/LanguageGuide/….

Nestor 28.05.2019 16:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
145
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Список захвата, такой как [someObject], на самом деле является синтаксическим сахаром для [someObject = someObject], где правая часть может быть произвольным выражением, которое привязывается к новой константе при формировании замыкания.

Поэтому один из вариантов - написать свой пример как:

jobsArray.append { [property = someObject!.property] in
  doExpensiveOperation(property)
}

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