2016-10-06 18 views
-1
let employerName = snapshot.value! ["employerName"] as! String 
let employerImage = snapshot.value! ["employerImage"] as! String 
let uid = snapshot.value! ["uid"] as! String 

私は以前の投稿を見直しましたが、この問題を解決する方法を見つけることはできません。すべての3行のコードは、 "type" Anyには添え字メンバーがありません "というエラーが返されます。かなり新しいので、どんな助けもありがとうございます。タイプ 'Any'には添え字がありません

+0

スナップショットはどのように宣言されていますか?それはfirebaseに関連していますか?あなたはそれをここに掲示する前にあなたの答えを探しましたか? –

+0

こんにちは。はい - Firebaseとはい私はここで答えを見直しました。おそらく私は答えを間違って統合していますか?私が言ったように、私はかなり新しいです。特定の回答に対する助言や提案は非常に高く評価されます。 – mw1016

+1

[swift 3:Type 'Any?]の可能な複製下付き文字のメンバーはありません](http://stackoverflow.com/questions/39549107/swift-3-type-any-has-no-subscript-members) – FelixSFD

答えて

1

snapshot.valueAnyの種類があります。添え字は、値を中括弧で囲む構文を使用する特別な種類の関数です。この添字関数はDictionaryによって実装されています。

ここでは、開発者としてsnapshot.valueDictionaryであることを知っていますが、コンパイラは認識していません。 AnyAnyの値で呼び出すため、subscriptが実装されていないため、subscript関数を呼び出せません。これを行うには、snapshot.valueが実際にDictionaryであることをコンパイラーに伝える必要があります。さらにDictionaryは、Dictionaryのキーがどんなタイプの値でも添字関数を使用できるようにします。だからDictionaryキーがString(AKA [String: Any])であることを伝える必要があります。それよりもさらに進んでいる場合は、Dictionaryのすべての値がStringであることを知っているようですので、Stringに添え字の後に各値をキャストする代わりに、 Stringタイプ(AKA [String: String])のキーと値がある場合、値にアクセスするためにサブスクリプトすることができ、コンパイラは値がStringであることも知っています!

guard let snapshotDict = snapshot.value as? [String: String] else { 
    // Do something to handle the error 
    // if your snapshot.value isn't the type you thought it was going to be. 
} 

let employerName = snapshotDict["employerName"] 
let employerImage = snapshotDict["employerImage"] 
let uid = snapshotDict["fid"] 

あなたはそれを持っています!

0

アンラップされた辞書としてsnapshot.valueを扱いたいので、1つにキャストして、成功すればその辞書を使用してください。

は何かなどを考えてみましょう:

func findElements(candidate: Any) { 
    if let dict: [String : String] = candidate as? Dictionary { 
     print(dict["employerName"]) 
     print(dict["employerImage"]) 
     print(dict["uid"]) 
    } 
} 

// Fake call  
let snapshotValue = ["employerName" : "name", "employerImage" : "image", "uid" : "345"] 
findElements(snapshotValue) 
関連する問題