【问题标题】:Xcode 9.4.1: Value of type 'String' has no member 'setValue'Xcode 9.4.1:“String”类型的值没有成员“setValue”
【发布时间】:2019-07-25 23:17:09
【问题描述】:

我正在通过 Udemy 教程学习 Swift,该教程展示了如何使用 Firebase 数据库制作聊天应用程序。为了我自己的学习和快速参考指南,我在一个 .swift 文件中键入了代码,以快速了解整个应用程序并练习调试。但是,我还有一个编译器错误说常量“messagesDB”没有成员“setValue”。我假设messagesDB 作为“数据库”类的一个实例可以访问setValue() 实例方法。为了消除这个错误,您认为我缺少什么?和函数的声明方式有关系吗?

Auth 和 Database 类都是模仿 Firebase 的任意类,因此可以显示其余代码而不会出现一堆错误,从而给我一个文件来查看事情是如何工作的。

class Auth {

    var currentUser: String = ""

    func auth() -> Self { return self }

}

class Database {

    func setValue() -> Self { return self }
    func database() -> Self { return self }
    func reference() -> Self { return self }
    func child(_ someString: String) -> String {
        print(someString)
    }

}

class ChatViewController: UIViewController {

    @IBOutlet var messageTextfield: UITextField!
    @IBOutlet var sendButton: UIButton!

    @IBAction func sendPressed(_ sender: AnyObject) {
        messageTextfield.endEditing(true)

        messageTextfield.isEnabled = false
        sendButton.isEnabled = false

        let messagesDB = Database().database().reference().child("Messages")
        let messageDictionary = ["Sender": Auth().auth().currentUser, "MessageBody": messageTextfield.text!] as [String : Any]

        messagesDB.setValue(messageDictionary) {  //ERROR: Value of type 'String' has no member 'setValue'
            (error, reference) in

            if error != nil {
                print(error!)
            } else {
                print("Message saved successfully!")
                self.messageTextfield.isEnabled = true
                self.sendButton.isEnabled = true
                self.messageTextfield.text = ""
            }
        }
    }
}

【问题讨论】:

  • 至少你的意思可能是..."MessageBody": messageTextfield.text!]
  • 谢谢!我对那个缺失的部分进行了编辑。不幸的是,仍然有一个错误。

标签: ios swift firebase firebase-realtime-database swift4


【解决方案1】:

child 方法返回 String 而不是 Database 实例,因此会出现错误消息。

先创建数据库实例,然后在需要的地方使用它:

let messagesDB = Database()
.
.
messagesDB.setValue(...

【讨论】:

  • 感谢您的回复。我在 Playground 中进行了更改,但现在错误显示“参数传递给不带参数的调用”。我尝试通过包含与 messageDictionary 相同类型的参数来修改 setValue() 方法,但没有运气。你介意在 Playground 中尝试一下,看看你会做些什么来消除错误吗?它可以是任何东西,因为它只是任意代码。
【解决方案2】:

这很简单,你的 messageDB 常量被设置为等于返回字符串的函数“child”,这就是为什么它告诉你“string”没有成员 setValue,所以你应该将你的 messageDB 设置为 Database ().database().reference()

【讨论】:

  • 感谢您的回复。我使用 Playground 进行了尝试,但错误更改为“传递给不带参数的调用的参数”。因此,然后我修改了 setValue 以具有与 messageDictionary 相同类型的参数,但随后它显示“调用中的额外参数”。我知道这段代码是任意的,但你介意在 Playground 中修改它,看看你会如何消除错误吗?谢谢!
  • @JCoder 我真的看不出在操场上使用该代码有什么意义,您错过了很多真正模仿 firebase 类的代码,但您可以从 firebase 本身尝试此链接@ 987654321@ 解释得很好,我想你会掌握一切如何使用 firebase
  • 感谢您的链接。大声笑,是的,我认为我的代码是荒谬的。我刚刚掌握了一般编程的窍门,以及函数和类实例的工作原理,这对我来说是一个很难掌握的概念。
猜你喜欢
  • 1970-01-01
  • 2016-05-27
  • 2016-12-03
  • 2019-08-21
  • 2019-02-03
  • 2016-06-08
  • 2017-02-14
  • 2018-07-12
  • 2019-08-14
相关资源
最近更新 更多