如何在 Swift 中调试 "Use of unresolved identifier"?

How to debug "Use of unresolved identifier" in Swift?

我正在学习 Xcode 和使用教程。我是初学者。

我正在查看这段代码,但不知道为什么会出现以下错误:

Use of unresolved identifier 'USER_REF'

但在代码中我很确定我引用了 USER - 是这样吗?

class DataService {

static let dataService = DataService()
fileprivate var _BASE_REF = Database.database().reference()
fileprivate var _USER_REF = Database.database().reference()
fileprivate var _USERPOST_REF = Database.database().reference()


var BASE_REF: DatabaseReference {
    return _BASE_REF
}

var USER_REF: DatabaseReference {
    return _USER_REF
}

var CURRENT_USER_REF: DatabaseReference {
    let userID = UserDefaults.standard.value(forKey: "uid") as! String

    let currentUser = Database.database().reference().child(byAppendingPath: "user").child(byAppendingPath: userID)

    return currentUser
}

var USERPOST_REF: DatabaseReference {
    return _USERPOST_REF
}
}

func createNewAccount(uid: String, user: Dictionary<String, String>) {

    // A User is born?

    USER_REF.child(byAppendingPath: uid).setValue(user)
}

func createNewUserPost(userpost: Dictionary<String, AnyObject>) {

    // Save the Post
    // USERPOST_REF is the parent of the new USERPOST: "userposts".
    // childByAutoId() saves the userpost and gives it its own ID.

    let firebaseNewUserPost = USERPOST_REF.childByAutoId()

    // setValue() saves to Firebase.

    firebaseNewUserPost?.setValue(userpost)
}

这是关于为什么缩进很重要的完美一课。 USERPOST_REF: DatabaseReference 结束后还有第二个 },它结束了 class DataService.

的范围

因此,createNewAccount(uid:user:)createNewUserPost(userpost:) 是独立函数,无法访问 DatabaseReference 的任何实例成员。

几点改进:

  1. Swift 所有属性、实例、class 或静态的约定是使用 lowerCamelCase。
  2. 不像其他语言(据我所知,Java 和 Ruby 是这里的主要违规者),没有必要使用 public getter(计算 属性),例如 filprivate _x: Int,带有 public var x: Int。也就是说,因为 _x 不是实例变量 。 Swift 实际上并没有让你创建实例变量。它们是在您创建属性时为您生成的。您正在做的是编写一个 属性 来访问您声明的 属性 ,以访问编译器合成的实例变量。没有这个必要。只需将 属性 的 setter 范围设为私有文件即可。
  3. Swift中单例的约定俗成的名字是shareddefaultmain。尝试坚持其中之一。此外,为了让您真正拥有一个单例,您需要通过使用 private 访问权限声明它来限制对初始化程序的访问。

以下是我的推荐:

class DataService {
    static let shared = DataService()
    private init() {}

    public fileprivate(set) var baseDB = Database.database().reference()
    public fileprivate(set) var userDB = Database.database().reference()
    public fileprivate(set) var userPostDB = Database.database().reference()

    var currentUser: DatabaseReference {
        let userID = UserDefaults.standard.value(forKey: "uid") as! String

        return Database.database()
            .reference()
            .child(byAppendingPath: "user")
            .child(byAppendingPath: userID)
    }


    func createNewAccount(uid: String, user: Dictionary<String, String>) {
        // A User is born?

        userDB.child(byAppendingPath: uid).setValue(user)
    }

    func createNewUserPost(userpost: Dictionary<String, AnyObject>) {
        // Save the Post
        // userPostDB is the parent of the new USERPOST: "userposts".
        // childByAutoId() saves the userpost and gives it its own ID.

        let firebaseNewUserPost = userPostDB.childByAutoId()

        // setValue() saves to Firebase.

        firebaseNewUserPost?.setValue(userpost)
    }
}