2017-01-19 3 views
1

У меня возникла небольшая проблема.В чем разница между Swift 2.3 и 3 при добавлении userInfo в NSNotification?

Предположим, что у меня есть Структура.

struct AlertNotificationObject { 

    let message: String 
} 

У меня есть проект в Swift 2.3, где я использую эту структуру поместить в словарь, затем в USERINFO: в NSNotification Observer. Я не мог заставить его работать, поэтому, чтобы исследовать мою проблему, я создал некоторую площадку.

Swift 3.0 версия - работает по назначению.

Обратите внимание, что мне нужно было создать empytClass, чтобы заставить его работать на игровой площадке Swift 3.

class emptyClass{ 
    @objc public func testFunction(){ 
     print ("It should work") 
    } 
} 

//MARK: observer //shouldnt bother us now. 
let emptyClassRef = emptyClass() 

NotificationCenter.default.addObserver(emptyClassRef, selector: #selector(emptyClass.testowFunction), name: NSNotification.Name(rawValue: "test0"), object: nil) 

//MARK: post 
let messageObject0 = AlertNotificationObject(message: "Test1") 
let messageDict0 = [1: messageObject0] 

let test0 = NSNotification.init(name: NSNotification.Name(rawValue: "test0"), object: nil, userInfo: messageDict0) 
NotificationCenter.default.post(test0 as Notification) 

В-приложение Swift 2,3 версия - помимо очевидных изменений синтаксиса, я не мог заставить это работать должным образом - я застрял в Notification проводке.

let messageObject0 = AlertNotificationObject(message: "test") 
    let messageDict = [1: messageObject0] 
    let showAlertWithBlur = NSNotification.init(name: "ShowAlertBlur", object: nil, userInfo: messageDict) 
    NSNotificationCenter.defaultCenter().postNotification(showAlertWithBlur) 

И я получил ошибку ... Я хотел бы понять, что случилось здесь, и прежде всего знать, почему он работал в Swift 3. Любые предложения, приветствия.

. Unfortunately it throws me this error

ответ

1

В Swift 3 Notification на самом деле является структурой, обновленной, чтобы хорошо работать с быстрым, а словарь информации о пользователе - это [AnyHashable : Any]. Вы можете поместить struct (тип значения) в Any.

Если вы используете NSNotification непосредственно (который является единственным вариантом в Swift 2), userInfo имеет тип NSDictionary, переведенный на Swift, как [AnyHashable: Any] в Swift 3 и, как [NSObject: AnyObject] в Swift 2.

AnyObject представляет только классы , вы не можете разместить там структуру.

Мой совет - не используйте структуры в Swift 2.x при взаимодействии с типами Obj-C.

Смежные вопросы