2016-09-13 18 views
11

güncelledikten sonra hiçbir simge üyesi bulunan Swift benim kodudur:Tipi 'Herhangi' Swift 3 İşte

currentUserFirebaseReference.observeSingleEvent(of: .value, with: { (snapshot: FIRDataSnapshot) in 
     let UID = snapshot.key 
     let pictureURL = snapshot.value!["pictureURL"] as! String 
     let name = snapshot.value!["displayname"] as! String 
     let currentUser = Person(name: name, bio: "", UID: UID, pictureURL: pictureURL) 
     self.currentUserInfo = currentUser 
      }) 

Sadece Xcode 8 güncellendi aşağıdaki hata iletisini neden olmuş görünüyor/Swift 3:

"Tür 'Herhangi' hayır simge üyesi vardır"

ben değilim, benim kodunda birçok yerde burada "]snapshot.value![" insert şey diyoruz Bu hatayı alıyorum ve kodumu çalıştıramıyorum.

Aşağıdaki kod çalışır:

let pic = (snapshot.value as? NSDictionary)?["pictureURL"] as? String ?? "" 

Ancak, ben değiştim görmüyorum veya ne önce ne kadar karşı şimdi bu gerekli kılmaktadır.

Farkında olduğum kadarıyla değişmiş olan tek şey gözlemin sözdizimi, ancak bunun neden kodumun çalışmayı durdurmasına neden olduğunu anlamıyorum. FIRDataSnapshot, value, id türünde

+0

[Tür 'Herhangi Bir'in' herhangi bir alt üyesine (firebase) sahip] olası kopyası var (http://stackoverflow.com/questions/39136026/type-any-has-no-subscript-members-firebase) –

+0

Düzeltme için teşekkürler Eric. Swift ile değiştirdiğim Objective C'ye bir referans daha vardı. –

cevap

8

.

Swift 3, id, Any olarak içe aktarılır. Firebase belgelerinde

, bu value herhangi biri olabilir diyor NSDictionary, NSArray, NSNumber veya NSString - açıkça, Altsimgeleme özellikle Swift, bunların tümünde mantıklı değil. Durumunuzda bir NSDictionary olduğunu biliyorsanız, bunu ona göndermelisiniz.

+0

Bana bir örnek verebilir misiniz? –

+0

Neye bir örnek? –

+0

Dönüştürmek için. Hibernia'nın kodunu denedim ve iyi çalıştı. Ancak, söylediklerinize bir örnek verdim. –

30

J. Cocoe cevabı kesinlikle doğru olduğunu, ancak bir kod örneği ihtiyacı olanlar için bu bunu nasıl:

let name = snapshot.value!["displayname"] as! String 

let snapshotValue = snapshot.value as? NSDictionary 
let name = snapshotValue["displayName"] as? String 

fikri deneyin

yerine Herhangi bir NSDictionary uygulamasından snapshot.value türünü yazmanız gerektiğidir.

Düzenleme: Connor belirttiği gibi, kuvvet bir arka uç sisteminden snapshot.value ya da bir şey unwrapping

nedeniyle muhtemelen alıcı beklenmedik bilgilere kötü bir fikirdir. Yani sen değişiyorsun! NSDictionary olarak? NSDictionary.

+1

Özellikle, Firebase gibi bir arka uç ile iletişim kurduğunuzda, değerin beklediğiniz gibi olmadığı ve uygulamanızın çökmesini istemediğinizde, unwrapping'i zorlamamanızı öneririz: snapshotValue = snapshot.value?NSDictionary, name = snapshotValue ["displayName"] olarak? Dize {\\ yapılacaklar}} – Connor

+2

Lütfen seçiminiz olmadıkça Swift dilinde "NSDictionary" öğesini kullanmayın. Yerel sözlük '[String: Any]' türü, tip bilgisi sağladığı için tercih edilir. – vadian