Извлечение уведомления userinfo в смешанном языковом проекте


Я работаю над смешанным языковым проектом, сочетающим в себе Objective C и Swift в XCode 6.

В этом проекте класс Singleton (Objective C) отправляет уведомление, которое затем получает ViewController (Swift).

Синглтон.h

#import <Foundation/Foundation.h>

NSString *const notificationString = @"notificationString";

@interface Singleton : NSObject

+ (id)sharedSingleton;

- (void)post;

@end

Синглтон.m

#import "Singleton.h"

static Singleton *shared = nil;

@implementation Singleton

- (id)init {
    self = [super init];
    if (self) {

    }
    return self;
}

#pragma mark - Interface

+ (Singleton *)sharedSingleton {
    static dispatch_once_t pred;

    dispatch_once(&pred, ^{
        shared = [[Singleton alloc] init];
    });

    return shared;
}

- (void)post {
    char bytes[5] = {5, 7, 9, 1, 3};

    NSDictionary *objects = @{@"device":[NSData dataWithBytes:bytes length:5], @"step1":[NSNumber numberWithInt:4], @"step2":[NSNumber numberWithInt:7]};

    [[NSNotificationCenter defaultCenter] postNotificationName:notificationString
                                                        object:self
                                                      userInfo:objects];
}

@end

Конечно, в этом смешанном языковом проекте заголовок моста должен быть настроен правильно (просто добавив в него #import "Singleton.h")

ViewController.swift

import UIKit

class ViewController: UIViewController {

    let singleton = Singleton.sharedSingleton() as Singleton

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        NSNotificationCenter.defaultCenter().addObserver(self, selector: "action:", name: notificationString, object: nil)

        singleton.post()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.


    }

    // MARK: - Notification

    func action(notification: NSNotification) {
        let userInfo = notification.userInfo as Dictionary<String, String> // things go wrong here?!
        let hash = userInfo["device"]
        let completed = userInfo["step1"]
        let total = userInfo["step2"] 

    }

}

Это не имеет никакого значения. ошибка компиляции. Однако во время выполнения XCode сообщает:

Фатальная ошибка: словарь не может быть соединен с Objective-C

notification.userInfo содержит NSDictionary, построенный NSSTring: NSData, NSSTring: NSNumber, NSSTring: NSNumber в то время как эта команда let userInfo = notification.userInfo as Dictionary<String, String> пытается преобразовать в Dictionary<String, String>

Является ли это причиной фатальной ошибки?

В ViewController.swift, что я должен сделать, чтобы "прочитать" NSDictionary, переданный в notification.userInfo, отправленный из Singleton.m?

Заранее спасибо

1 2

1 ответ:

Попробуйте сделать это

let userInfo = notification.userInfo as Dictionary<String, AnyObject>

Как вы указали, словарь userInfo содержит NSData, NSNUmber для значений.