Захват свойства объекта для замыкания в Swift - PullRequest
1 голос
/ 28 мая 2019

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

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, так что все указания с благодарностью получены.Спасибо!

1 Ответ

3 голосов
/ 28 мая 2019

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

Поэтому один из вариантов - написать ваш пример следующим образом:

jobsArray.append { [property = someObject!.property] in
  doExpensiveOperation(property)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...