преобразование кода swift в delphi — процедура объекта

#ios #delphi #firemonkey

#iOS #delphi #firemonkey

Вопрос:

У меня возникли проблемы с переводом в delphi функции, приведенной ниже

 - (BOOL)registerForTaskWithIdentifier:(NSString *)identifier 
                           usingQueue:(dispatch_queue_t)queue 
                        launchHandler:(void (^)(__kindof BGTask *task))launchHandler;
  

и это пример использования :

     BGTaskScheduler.shared.register(forTaskWithIdentifier: 'toto', using: nil) { (task) in

       task.expirationHandler = {
         task.setTaskCompleted(success: false)
       }

     }
   
  

Это обсуждение delphi, которое я сделал из заголовка :

   BGTaskScheduler = interface(NSObject)
    function registerForTaskWithIdentifier(identifier: NSString; usingQueue: dispatch_queue_t; launchHandler: TBackgroundTasksLaunchHandler) : Boolean; cdecl;
  end;

  BGTask = interface(NSObject)
    procedure setExpirationHandler(expirationHandler: TBackgroundTasksExpirationHandler); cdecl;
  end;
  

Но я не понимаю, как я могу сделать эту часть в delphi :

        task.expirationHandler = {
         task.setTaskCompleted(success: false)
       }
  

Комментарии:

1. У меня нет никакого опыта работы со Swift, но, основываясь на коде, я бы предположил, что последним показанным вами кодом может быть назначение определенного метода некоторому обработчику событий, чтобы такой метод выполнялся один раз, когда он даже срабатывает. Возможно, я ошибаюсь.

2. @SilverWarior да, я думаю точно так же, как и вы, единственная проблема заключается в том, что, насколько я знаю, у них нет понятия процедуры объекта в интерфейсе Objective c к delphi. Я ошибаюсь?

3. В Delphi сам интерфейс не может хранить какие-либо данные самостоятельно. Таким образом, вы не можете сохранить ссылку на метод объекта, как это делает пример кода. Но при чтении BGTaskScheduler планировщик задач фактически объявляется как класс, а не интерфейс. Теперь, насколько я знаю, для того, чтобы интерфейс мог обращаться к полям класса, для этого необходимо использовать собственные методы класса. Но мои знания о работе с интерфейсами в Delphi довольно просты, поэтому я могу ошибаться

4. наконец, я нашел, что их метод, такой как SetexpirationHandler, может сделать трюк 🙂