从 'FIRRemoteConfigValue!' 转换为无关类型 'String' 总是失败

Cast from 'FIRRemoteConfigValue!' to unrelated type 'String' always fails

我的项目中有大约 50 个相同的警告。自更新以来,我调用 snapshot.value["something"] as! String 的所有函数都失败了。他们都曾经工作过。我什至没有使用 RemoteConfig 功能。我只是想检索数据。

来自我的用户的示例 class:

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 pod 会导致此错误。一旦我卸载了 pod,警告就消失了。绝对把它作为一个错误。

这对我有帮助:

if let value = snapshot.value as? [String : AnyObject] {

这显然是一个错误,但目前我想我找到了解决方法。

这就是我在导入 RemoteConfig pod

之前提取信息的方式

旧代码

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 似乎可以解决问题,至少对我而言。

这适用于如下所示的数据库:

 - Data
     - ObjectOne
          - someKey: 'someStringValue'
     - ObjectTwo
          - someKey: 'anotherStringValue'

这对我来说很有魅力,从您仅使用 Firebase 实时数据库的 swift file/class 中删除

import Firebase

并添加

import FirebaseAuth

import FirebaseDatabase

确保不要同时导入 firebase 数据库和 fire base 远程配置 class,这显然是 Google

的错误

值 属性 是一个 id (AnyObject),您可能需要自己将其转换为字典。

let val = snapshot.value as! NSDictionary?
firstName = val!["firstName"] as! String

我遇到了同样的问题,下面的代码非常适合我。

使用valueForKey代替[]括号访问值

然后所有值都消失了...

例如

下面的代码发出警告...

 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