2014-10-13 16 views
5

UILocalNotification öğesinden userInfo sözlüğüm var. Implicit unwrapping kullanırken String değerini almanın kolay bir yolu var mı?Kullanıcı dizesiyle söz dizimi alın Sözlük

if let s = userInfo?["ID"] 

Bana bir dizeye yayınlamam gereken bir AnyObject verir. paketini ve dökme dize için başka for değişken bir edebi -

if let s = userInfo?["ID"] as String 

Sadece bir dize almak için iki değişkenleri bildirmek zorunda kalmak istemediğini bana

StringLiteralConvertable

ilgili bir hata verir.

Düzenleme İşte benim yöntemidir. Bu işe yaramıyor - I (ifre, AnyObject) If deyiminde String dönüştürülebilir değil olsun.

for notification in scheduledNotifications 
    { 
    // optional chainging 
    let userInfo = notification.userInfo 

    if let id = userInfo?[ "ID" ] as? String 
    { 
     println("Id found: " + id) 
    } 
    else 
    { 
     println("ID not found") 
    } 
    } 

Sorumun buna sahip değil, ama işe bu şekilde elde yanında, aslında bir koşul as? kullanılarak döküm kullanmak istediğiniz

if let s = notification.userInfo?["ID"] as String 

cevap

19

olmasını istiyorum :

(Not:. Bu Xcode 6.1 için çalışır Xcode 6.0 için aşağıya bakın)

if let s = userInfo?["ID"] as? String { 
    // When we get here, we know "ID" is a valid key 
    // and that the value is a String. 
} 
.210

Bu yapı güvenli userInfo bir dize extract userInfo olan

  • ise nil, userInfo?["ID"] döner nil nedeniyle ve nil arasında bir değere sahiptir tip String? bir değişken döndürürkoşullu döküm zincir isteğe bağlı için . isteğe bağlı bağlayıcı başarısız olur ve blok girilmez.

  • "ID" sözlükte geçerli bir anahtar değilse, userInfo?["ID"], nil değerini döndürür ve önceki duruma benzer şekilde devam eder. değeri, başka bir tür ise

  • (gibi Int), daha sonra koşullu dökümas?nil dönmek ve yukarıdaki örneklerde olduğu gibi devam edecektir.

  • Son olarak, userInfonil değildir ve "ID" sözlükte geçerli bir anahtardır ve değerin tipi bir String, dize içeren isteğe bağlı bir dize String? döndürür sonra şartlı döküm ise. isteğe bağlı bağlamaif let daha sonra String'u açıp String türüne sahip olan s'a atar.Xcode 6.0 için


, yapmanız gereken bir ek bir şey yoktur. NSString bir nesne türü ve String olmadığı için için koşullu olarak String yerine yayınlamanız gerekir. Onlar görünüşte Xcode 6.1 ile uğraşan iyileştiğini, ancak Xcode 6.0 do için aşağıdaki:

if let s:String = userInfo?["ID"] as? NSString { 
    // When we get here, we know "ID" is a valid key 
    // and that the value is a String. 
} 

Son olarak, son noktayı ele:

for notification in scheduledNotifications 
    { 
     if let id:String = notification.userInfo?["ID"] as? NSString 
     { 
      println("Id found: " + id) 
     } 
     else 
     { 
      println("ID not found") 
     } 
    } 
+0

Bu işe yaramadı. Fonksiyonumu gönderdim. Ayrıca, orijinal soruya sahip değilim, ancak orijinal olarak bildirime userInfo'ya erişmek istedim. Yani bildirim.userInfo ["ID"]. – Brian

+0

Güncellenmiş yanıtımı görün. – vacawama

+0

Teşekkürler. Xcode 6.0.1 kullanıyordum. 6.1'e yükseltildi ve çalıştı. – Brian