Передача закрытия в userInfo в NotificationCenter, получение сообщений crypti c от компилятора во время выполнения - PullRequest
0 голосов
/ 05 августа 2020

Пытаюсь передать закрытие в userInfo через NotificationCenter. Замыкания работают, как ожидалось, но я получаю странные сообщения, которые я не понимаю во время выполнения. Какова причина этого сообщения?

Сообщение:

0x000000010292b350 [ProjectName] `частичный перенаправитель применения для помощника преобразователя реабстракции из @escaping @callee_guaranteed () -> (@ out ()) в @escaping @callee_guaranteed () -> () в

Вот как я публикую уведомление.

let closure: (() -> Void) = {
        print("TEST")
    }
        
NotificationCenter.default.post(name: .test, 
    object: nil, 
    userInfo: ["closure" : closure ])

Вот как я использую notificaiton:

@objc private func test(_ notification: Notification) {
    let closure = notification.userInfo?["closure"] as? (() -> Void)
    closure?()
}

Я использую Swift 5.

1 Ответ

0 голосов
/ 06 августа 2020

К сожалению, я не могу воспроизвести ошибку, но я бы предложил заключить закрытие в класс-оболочку. Вещи, которые должны возвращаться в Какао и обратно, работают лучше, когда они являются объектами NSObject:

class Wrapper : NSObject {
    let closure : () -> Void
    init(closure: @escaping () -> Void) {
        self.closure = closure
    }
}

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        let closure: (() -> Void) = {
            print("TEST")
        }
        let wrapper = Wrapper(closure: closure)
        let test = Notification.Name("Test")
        NotificationCenter.default.addObserver(self,
            selector: #selector(testing), name: test, object: nil)
        NotificationCenter.default.post(name: test,
            object: nil, userInfo: ["wrapper" : wrapper ])
    }

    @objc private func testing(_ notification: Notification) {
        let wrapper = notification.userInfo?["wrapper"] as? Wrapper
        wrapper?.closure()
    }
}

...