2017-01-19 6 views
1

Ich habe ein kleines Problem festgestellt.Was ist der Unterschied zwischen Swift 2.3 und 3 beim Hinzufügen von userInfo zu NSNotification?

Nehmen wir an, ich habe Struktur.

struct AlertNotificationObject { 

    let message: String 
} 

Ich habe Projekt in Swift 2.3, wo ich diese Struktur verwenden in Wörterbuch setzen, dann in userinfo: in NSNotification Observer. Ich konnte es nicht funktionieren lassen. Um mein Problem zu untersuchen, habe ich einen Spielplatz geschaffen.

Swift 3.0 Version - funktioniert wie vorgesehen.

Bitte beachten Sie, dass ich empytClass erstellen musste, nur um es in Swift 3 Spielplatz arbeiten zu lassen.

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) 

In-App-Swift 2.3 Version - abgesehen von offensichtlichen Syntaxänderungen, konnte ich dies nicht richtig an der Arbeit - ich in Mitteilung Entsendung stecken geblieben.

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

Und ich habe einen Fehler habe ... Ich möchte verstehen, was hier falsch ist und vor allem zu wissen, warum es in Swift 3. Irgendwelche Vorschläge gearbeitet, willkommen.

. Unfortunately it throws me this error

Antwort

1

In Swift 3 ist die Notification eigentlich eine Struktur, aktualisiert, um gut mit Swift arbeiten und das Benutzer Info-Wörterbuch ist ein [AnyHashable : Any]. Sie können eine Struktur (einen Werttyp) in Any einfügen.

Wenn Sie die NSNotification direkt verwenden (was in Swift 2 ist Ihre einzige Option), userInfo Typ hat NSDictionary die 3 bis Swift als [AnyHashable: Any] in Swift übersetzt und als [NSObject: AnyObject] in Swift 2.

AnyObject stellt nur Klassen , Sie können dort keine Struktur einfügen.

Mein Ratschlag - verwenden Sie keine Strukturen in Swift 2.x bei der Interaktion mit Obj-C-Typen.

Verwandte Themen