从“FIRRemoteConfigValue!”投射 到不相关的types“string”总是失败
在我的项目中,我有大约50个同样的警告。 自更新以来,我把我所谓的snapshot.value["something"] as! String
我的所有functionsnapshot.value["something"] as! String
snapshot.value["something"] as! String
失败。 他们都曾经工作过。 我甚至没有使用RemoteConfigfunction。 我只想检索数据。
来自我的用户类的示例:
init(snapshot: FIRDataSnapshot) { firstName = snapshot.value!["firstName"] as! String lastName = snapshot.value!["lastName"] as! String }
一个函数的例子(我可以给出更多的例子,但基本上更多的是相同的):
func loadProfileImage(ref:FIRDatabaseReference) { ref.observeEventType(.Value, withBlock: {snapshot in let base64String = snapshot.value!["profileImgURL"] as! String let decodedData = NSData(base64EncodedString: base64String, options:NSDataBase64DecodingOptions.IgnoreUnknownCharacters) if let decodedImage = UIImage(data: decodedData!) { self.profileImgImageView.contentMode = .ScaleAspectFill self.profileImgImageView.layer.cornerRadius = self.profileImgImageView.frame.size.width / 2 self.profileImgImageView.clipsToBounds = true self.profileImgImageView.image = decodedImage as UIImage } }) }
该应用程序运行,因为它们只是警告,但警告是正确的,因为应用程序尝试检索任何数据时就会失败。
所以显然有Firebase / RemoteConfig吊舱导致这个错误。 只要我卸下吊舱,警告就消失了。 肯定把这个作为一个错误。
这显然是一个错误,但目前我认为我find了一个工作。
这是我导入RemoteConfig窗格之前的信息
老代码
let databaseRef = FIRDatabase.database().referenceWithPath("Data"); _ = databaseRef.observeEventType(FIRDataEventType.Value, withBlock: { (snapshot) in for (item) in snapshot.children { let someValue = item.value!["someKey"] as? String } }
这工作得很好。
在将pod 'Firebase/RemoteConfig'
到我的Podfile并运行pod install
,发生了上述警告。
这是我如何解决这个问题。
新代码
let databaseRef = FIRDatabase.database().referenceWithPath("Data"); _ = databaseRef.observeEventType(FIRDataEventType.Value, withBlock: { (snapshot) in if let resources = snapshot.value as? [String : AnyObject] { for (key, obj) in resources { if let dataObject = obj as? [String : AnyObject] { let someValue = dataObject["someKey"] as? String // Other data types still work let someArray = resource["someArrayKey"] as? NSArray let someBool = resource["someBoolKey"] as? Bool } } } }
对于String来说,将值转换为String对于我来说至less是一个窍门。
这是一个数据库,看起来像这样:
- Data - ObjectOne - someKey: 'someStringValue' - ObjectTwo - someKey: 'anotherStringValue'
value属性是一个id(AnyObject),你可能需要把它转换成字典。
let val = snapshot.value as! NSDictionary? firstName = val!["firstName"] as! String
对 !!! 终于有了解决办法…
使用valueForKey
而不是[]
括号访问值
然后所有的价值消失…
例如
Warning code...
下面的代码给出警告…
let someArray = resource["someArrayKey"] as? NSArray let someBool = resource["someBoolKey"] as? Bool
像这样使用
let someArray = resource.valueForKey("someArrayKey") as? NSArray let someBool = resource.valueForKey("someBoolKey") as? Bool
警告不会出现更长的时间…..
这帮助了我:
if let value = snapshot.value as? [String : AnyObject] {
这对我来说就像是魅力,从你正在使用Firebase实时数据库的swift文件/类中删除
import Firebase
并添加
import FirebaseAuth
import FirebaseDatabase
请确保不要在同一个类中导入Firebase数据库和Firebase远程configuration,这显然是来自Google的一个bug