Проблема делегата между Objective-C и Swift - PullRequest
0 голосов
/ 20 мая 2018

Я только начинаю изучать основы Swift, Objective-C & C ++.Я пытаюсь построить мост между Objective-C и Swift и настроить подходящий делегат (MyDelegate).

Код ниже работает довольно хорошо, но у меня возникли некоторые проблемы с вызовом функции Swift callbackInteger() изстатическая функция, такая как:

MyFile.mm:

static void test() {
    // how to call callbackInteger?
}

MyFile.mm:

- (void)callbackToSwift:(int)testInteger {
    if (self.delegate != nil) {
        [self.delegate callbackInteger: testInteger];
    }
}

MyDelegate.h:

@protocol MyDelegate <NSObject>
- (void) callbackInteger: (int) testInteger;
@end

ViewController.swift:

class ViewController: UIViewController, MyDelegate {
    func callbackInteger(_ testInteger: Int) {
       print("testInteger: \(testInteger)");
    }
}

Примечание : я действительно не представляю, как добиться вызова функции callbackInteger с помощью вызова делегата.

1 Ответ

0 голосов
/ 20 мая 2018

Протокол - это не более чем набор требований (методов), которые должен реализовать класс.Мы говорим, что класс соответствует протоколу.

Так что в вашей статической функции test() вы не можете вызвать метод протокола, если у вас нет экземпляра / объекта (здесь ViewController).Рабочий способ (но не обязательно красивый) будет где-то хранить (например, в качестве глобальной переменной) экземпляр ViewController, чтобы повторно использовать его в функции.

Примерно так:

// Top of your file
#import <Foundation/Foundation.h>
// other headers...

id<MyDelegate> globalDelegate;

static void test() {
    [globalDelegate callbackInteger:42];
}

// rest of your file

Существует множество ресурсов о протоколах и шаблонах делегирования, таких как это руководство от Apple .Внимательно прочитайте, как они используют его в Cocoa & Cocoa Touch.

...