Swift : '(NSObject, AnyObject) " verfügt nicht über einen member mit dem Namen 'Tiefgestellt'
Ich versuche zu extrahieren, die Abzeichen Wert aus der userInfo-Wörterbuch ein remote-Benachrichtigung.
Ich lese viele post und finden eine Lösung meines Problems, aber ich bin nicht sehr zufrieden!
So, hier ist meine Datenstruktur (habe ich entfernt die nutzlosen Zeilen): { aps = { badge = 7 } }
Extrahieren, diese Zahl '7' out of my userInfo
ich möchte Folgendes tun:
self.updateAppIcon(userInfo["aps"]["badge"] as? Int)
Aber natürlich bekomme ich die folgende Fehlermeldung :
Swift : '(NSObject, AnyObject) " verfügt nicht über einen member mit dem Namen 'Tiefgestellt'
Wenn ich mich nicht Irre, ist es, weil []
gibt ein AnyObject, die nicht interpretiert werden kann als ein anderes Wörterbuch.
Einen funktionierende Lösung wäre Folgendes zu tun:
func handleRemoteNotifiation(userInfo: [NSObject : AnyObject]) {
if let aps: AnyObject = userInfo["aps"] {
if let apsDict = aps as? [String : AnyObject]{
if let badge: AnyObject = apsDict["badge"] {
self.updateAppIconBadgeNumber(badge as? Int)
}
}
}
}
func updateAppIconBadgeNumber(number: Int?) {
//do stuff here
}
Aber im ernst... könnte ich es in ein mehr sexy ist Weg ? weniger Linien, weniger, wenn die Klauseln, weniger Stationen, etc? Dies ist so ein "code-Komplex" - Lösung, die eine einfache Sache.
Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kürzesten ist:
?
zwischen["aps"]
und["badge"]
heißt "Optional Chaining".Sie benötigen diese, da
userInfo["aps"]
können zurücknil
.Und Sie nicht haben, um wirken zu
[String : AnyObject]
weil jederAnyObject
hat 'Tiefgestellt' Mitglied.Und Warum müssen wir
[ ... ][0]
in Xcode 6.0.1 ist... ich weiß es nicht 🙁 .ein Fehler, vielleicht.Könnten Sie null coleascing Bediener und machen Sie es kurz, aber Sie verlieren kann, die Lesbarkeit zu verbessern. Wenn Sie eine single-line-version der Methode, wie diese,
Könnte man typealias [String: AnyObject] und lassen es so Aussehen, kaum mehr lesbar.
nil coalescing operator: ??
ist ausführlich in apples iBook. Ich kann nicht scheinen, um block-Zitat in einem Kommentar SO, aber hier ist eine direkte Kopie von dem, was das Buch sagt: Das nil-coalescing-operator(a ?? b)
packt einen optionalen ein, wenn es einen Wert enthält, oder gibt einen default-Wert b wenn a null ist. Der Ausdruck a ist immer von einem optionalen Typ. Der Ausdruck b muss mit dem Typ, der gespeichert ist im inneren ein. Der nil-coalescing-operator ist die Kurzform für den folgenden code:a != nil ? a! : b