Проблема с вашей handleVisionRequestUpdate
функцией.
Прежде всего @Azat был прав в комментариях: когда вы объявляете let yTrack = Double(self.transformedRect?.origin.y ?? 0.5)
, вы создаете новую переменную в области действия этой функции, которая не имеет отношения к var yTrack
из области действия ViewController
.
Поэтому, когда вы печатаете yTrack
в этой функции, вы печатаете внутреннюю переменную функции, которая будет уничтожена после ее возврата.Чтобы иметь возможность использовать yTrack
вне функции, вам нужно присвоить новое значение для ViewController
youTrack
, и тогда вы сможете использовать его в любой функции, которую вы хотите
yTrack = Double(self.transformedRect?.origin.y ?? 0.5)
Вторая проблема с DispatchQueue.main.async
.Код внутри этого блока будет выполняться в большинстве случаев после этого блока
let yTrack = Double(self.transformedRect?.origin.y ?? 0.5)
print(yTrack as Any)
, потому что с помощью этого блока вы говорите компилятору «создать отдельную« очередь »для этого блока кода и выполнять ее асинхронно, когда вы будетебыть в состоянии сделать это ", так что эта строка self.transformedRect = newObservation.boundingBox
будет выполнена в большинстве случаев после этой строки let yTrack = Double(self.transformedRect?.origin.y ?? 0.5)
, и у вас будет предыдущий transformedRect
внутри этой строки, равный nil
, если я правильно понимаю.Поэтому удалите DispatchQueue.main.async
из этой функции или переместите self.yTrack = Double(self.transformedRect?.origin.y ?? 0.5)
в нее.