【问题标题】:Cast from 'FIRRemoteConfigValue!' to unrelated type 'String' always fails从“FIRRemoteConfigValue!”投射到不相关的类型“字符串”总是失败
【发布时间】:2016-09-17 01:23:06
【问题描述】:

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

来自我的用户类的示例:

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
            }
        })
    }

应用程序运行是因为它们只是警告,但警告是正确的,因为应用程序一旦尝试检索任何数据就会失败。

【问题讨论】:

  • 我遇到了同样的问题,但我也在尝试实际使用远程配置。你有没有得到这个工作?

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

显然拥有 Firebase/RemoteConfig pod 会导致此错误。一旦我卸载了 pod,警告就消失了。绝对把它作为一个错误。

【讨论】:

  • 您的问题解决了吗?
  • 如果你需要使用 RemoteConfig 怎么办?
【解决方案2】:

我也遇到过同样的问题,下面的代码可以完美地工作。

使用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

【讨论】:

    【解决方案3】:

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

    这就是我导入 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
                    }
                }
        }
    }
    

    至少对我来说,将值显式转换为字符串似乎可以解决问题。

    这是一个看起来像这样的数据库:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        这对我有帮助:

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

        【讨论】:

        【解决方案6】:

        这对我来说就像魅力一样,从您仅使用 Firebase 实时数据库的 swift 文件/类中删除

        import Firebase

        并添加

        import FirebaseAuth

        import FirebaseDatabase

        确保不要在同一个类中导入 firebase 数据库和 fire base 远程配置,这显然是来自 Google 的错误

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多