从“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