Xcode 9.4.1:类型为'String'的值没有成员'setValue'

时间:2019-03-04 15:47:36

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

我正在从Udemy教程中学习Swift,该教程展示了如何使用Firebase数据库制作聊天应用程序。为了自己的学习并作为快速参考指南,我在一个.swift文件中键入了代码,以快速了解整个应用程序并进行调试。但是,我还有一个编译器错误,指出常量“ messagesDB”没有成员“ setValue”。我假设messagesDB是类'Database'的实例,可以访问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 = ""
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

apply(xdata[, x], 1, max) : dim(X) must have a positive length 方法返回一个child而不是一个String实例,因此返回错误消息。

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

Database

答案 1 :(得分:0)

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