Type 'Any' has no subscript members (firebase)
snapshot.value
has the type Any?
, so you need to cast it to the underlying type before you can subscript it. Since snapshot.value!.dynamicType
is NSDictionary
, use an optional cast as? NSDictionary
to establish the type, and then you can access the value in the dictionary:
if let dict = snapshot.value as? NSDictionary, postContent = dict["content"] as? String {
content = postContent
} else {
content = ""
}
Or, you can do it as a one-liner:
content = (snapshot.value as? NSDictionary)?["content"] as? String ?? ""
type 'Any?' has no subscript members (using Firebase)
Two issues.
1. Optionals
This is Swift's way of making a variable be in one of two states namely, have a value or be nil
. A variable can only be in one of these states. You make a variable an optional by adding a question mark in front of it.
2. Any
By declaring a variable to be of type Any
, this means you're not explicitly stating its type during declaration. Firebase makes all of its returns be of type Any
in order to give us developers the option of fiddling with the data as we so please hence less constraints on our side.
snapshot.value
is of type Any
but Firebase always returns a JSON tree and JSON trees can be represented as Dictionaries. So what should we do?
- Since
snapshot.value
is an optional, we should check first to see if itsnil
. - If not
nil
, convert it to a dictionary then start accessing the respective elements inside it.
The code below does the job for you and I've added comments to explain what's happening.
ref?.child("Users").child(username).observeSingleEvent(of: .value, with:
{ (snapshot) in
// This does two things.
// It first checks to see if snapshot.value is nil. If it is nil, then it goes inside the else statement then prints out the statement and stops execution.
// If it isn't nil though, it converts it into a dictionary that maps a String as its key and the value of type AnyObject then stores this dictionary into the variable firebaseResponse.
// I used [String:Any] because this will handle all types of data types. So your data can be Int, String, Double and even Arrays.
guard let firebaseResponse = snapshot.value as? [String:Any] else
{
print("Snapshot is nil hence no data returned")
return
}
// At this point we just convert the respective element back to its proper data type i.e from AnyObject to say String or Int etc
let userName = firebaseResponse["Username"] as! String
self.usernameField.text = username
})
type 'Any' has no subscript members
snapshot.value
has a type of Any
. A subscript is a special kind of function that uses the syntax of enclosing a value in braces. This subscript function is implemented by Dictionary
.
So what is happening here is that YOU as the developer know that snapshot.value
is a Dictionary
, but the compiler doesn't. It won't let you call the subscript
function because you are trying to call it on a value of type Any
and Any
does not implement subscript
. In order to do this, you have to tell the compiler that your snapshot.value
is actually a Dictionary
. Further more Dictionary
lets you use the subscript function with values of whatever type the Dictionary
's keys are. So you need to tell it you have a Dictionary
with keys as String
(AKA [String: Any]
). Going even further than that, in your case, you seem to know that all of the values in your Dictionary
are String
as well, so instead of casting each value after you subscript it to String
using as! String
, if you just tell it that your Dictionary
has keys and values that are both String
types (AKA [String: String]
), then you will be able to subscript to access the values and the compiler will know the values are String
also!
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"]
And there you have it!
Type 'Any' has no subscript members after updating to Swift 3
In FIRDataSnapshot, value
is of type id
.
In Swift 3, id
is imported as Any
.
In the Firebase documentation, it says value
can be any of NSDictionary
, NSArray
, NSNumber
, or NSString
-- clearly, subscripting doesn't make sense on all of these, especially in Swift. If you know it's an NSDictionary
in your case, then you should cast it to that.
Type 'Any' has no subscript members when accessing dictionary in UserDefaults
The reason of showing this error in your code is: the compiler cannot recognize result
as dictionary, if you tried to option and click on result
you would see that its type is Any
. You have to cast it first as [String: AnyObject]
and then get "Authorities" form it.
It should be like this:
if let result = UserDefaults.standard.dictionary(forKey: "dict") {
print(result)
}
That's how you should "optional binding" the dictionary, thus (assumeing that "Authorities" is a [String: String]
):
if let addresses = result["Authorities"] as? [String: String] {
print(addresses)
}
You could also do it as one step:
if let result = UserDefaults.standard.dictionary(forKey: "dict"),
let addresses = result["Authorities"] as? [String: String] {
print(result)
print(addresses)
let levelAccess = addresses["levelAccess"]
print(levelAccess) // optional
}
Finally, you could get the levelAcess
from addresses
as:
let levelAccess = addresses["levelAccess"]
Again, note that levelAccess
would be an optional
string (String?
), which means you should also handle it.
Type 'Any?' has no subscript members
change this
let email = result["email"] as? String
into
guard let resultNew = result as? [String:Any]
let email = resultNew["email"] as! String
full answer
let parameters = ["fields": "email, first_name, last_name, picture.type(large)"]
FBSDKGraphRequest(graphPath: "me", parameters: parameters).start { (connection, result, error) in
guard let resultNew = result as? [String:Any]
let email = resultNew["email"] as! String
}
Related Topics
Send Messages Between iOS and Watchos with Watchconnectivity in Watchos2
Xcode - Bundle Format Unrecognized, Invalid, or Unsuitable
Add a Uiview Above All, Even the Navigation Bar
How to Create a Simple Checkbox in iOS
Swift Performselector:Withobject:Afterdelay: Is Unavailable
Wrapping Text in a Uitextview Around a Uiimage Without Coretext
Uicollectionview - Diddeselectitematindexpath Not Called If Cell Is Selected
What Does the Text Inside Parentheses in @Interface and @Implementation Directives Mean
Creating Framework That Requires (Depends On) Another Framework
How to Present a Uiviewcontroller from Skscene
What Is Kcferrordomaincfnetwork Code=303
How to Use Presentmodalviewcontroller to Create a Transparent View
iOS Autolayout with Uiscrollview: Why Does Content View of Scroll View Not Fill the Scroll View
Xcode 8 "The Aps-Environment Entitlement Is Missing from the App's Signature" on Submit
Hiding Uitabbar When Pushing a Uiview