как внедрить делегата в Swift с помощью тайфуна?

Используя тайфун, я пытаюсь внедрить тип «рабочего» в свой контроллер представления. мой «Рабочий» требует делегата, чтобы, когда работа выполнена, он вызывал этот метод. Мне нужно настроить мой контроллер представления как делегат рабочего класса, который был введен. другими словами, круговая зависимость.

Обновленный вопрос с источником:

//my typhoon assembly class
import Typhoon
class Assembly : TyphoonAssembly {

    public dynamic func viewController() -> AnyObject {
        return TyphoonDefinition.withClass(ViewController.self) {
            (definition) in

            definition.injectProperty("worker", with: self.foo())
            definition.scope = TyphoonScope.Singleton
        }
    }


    public dynamic func foo() -> AnyObject {
        return TyphoonDefinition.withClass(Foo.self) {
            (definition) in

            definition.injectProperty("delegate", with: self.viewController())
        }
    }

}

Foo - это место, где выполняется работа, он реализует протокол WorkHandler и имеет делегат типа SomeProtocol для вызова после завершения работы:

import Foundation

@objc
protocol SomeProtocol: class {
    optional func hasFinishedWork(value: Bool)
}

protocol WorkHandler : class {
    func doSomething()
}



class Foo: WorkHandler{

    //how will this get set?
    var delegate:SomeProtocol?

    func doSomething(){
        print("doing the work")
        delegate?.hasFinishedWork!(true)
    }
}

И мой ViewController соответствует SomeProtocol следующим образом:

import UIKit

class ViewController: UIViewController, SomeProtocol{

    var worker:WorkHandler?

    override func viewDidLoad() {
        super.viewDidLoad()

        worker?.doSomething();
    }

    @objc func hasFinishedWork(value: Bool){
        print("The work was all done")
    }
}

приведенный выше код дает следующую ошибку при запуске:

2016-02-29 20:25:43.250 TestApp[30604:5316415] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Subclass of NSProxy or NSObject is required.'

Кто-нибудь может помочь с этим?


person ke3pup    schedule 28.02.2016    source источник
comment
Swift такой же, как и Objective-C: github.com/appsquickly /Тайфун/вики/ . . это работает из-за области ObjectGraph Typhoon (по умолчанию).   -  person Jasper Blues    schedule 28.02.2016
comment
@JasperBlues какой-нибудь известный вам пример кода в swift? Похоже, мне действительно нужно использовать циклическую инъекцию зависимостей, но я не могу заставить ее работать. Их пример проекта PocketForcast не помог.   -  person ke3pup    schedule 28.02.2016
comment
У swift есть мощное перечисление, и я восхищаюсь тем, как легко он может решать сложные проблемы.   -  person Bishal Ghimire    schedule 28.02.2016
comment
В вашем примере кода отсутствует определение метода foo(), который должен возвращать экземпляр Foo. Вот где вы бы injectProperty(@selector(delegate), with:self.appSettingsController).   -  person Slipp D. Thompson    schedule 28.02.2016
comment
@SlippD.Thompson нет, это не так. Я добавил полный источник выше. Пожалуйста, посмотрите. спасибо   -  person ke3pup    schedule 29.02.2016


Ответы (1)


Оказывается, мне пришлось сделать так, чтобы мой протокол наследовался от NSObject:

@objc
protocol SomeProtocol: class {
    optional func hasFinishedWork(value: Bool)
}

@objc
protocol WorkHandler : class {
    func doSomething()
}




class Foo: NSObject, WorkHandler{

    //how will this get set?
    var delegate:SomeProtocol?

    @objc func doSomething(){
        print("doing the work")
        delegate?.hasFinishedWork!(true)
    }
}

Теперь он работает так, как ожидалось.

person ke3pup    schedule 29.02.2016