«Я делал это таким образом и нашел сообщение, в котором говорится, что оно может даже не быть выполнено»
Возможно, он не будет выполнен, потому что вы не вызываете обработчик завершения на всех путях.
Как Ш_Кхан упомянул в своем ответе, вам на самом деле не нужен обработчик завершения, вам нужно использовать методы делегата, чтобы получать информацию о его завершении и о том, был ли он успешным или нет. Но ваша особая проблема с вашим конкретным кодом заключается в том, что вы не вызываете завершение в операторе if.
if !self.canMakePayments {
return
}
Вероятно, должно быть
guard canMakePayments else {
completion()
return
}
В вашем коде, если canMakePayments имеет значение false, ваш код завершения не будет выполнен.