Как отладить «Использование неразрешенного идентификатора» в Swift? - PullRequest
0 голосов
/ 01 июля 2018

Я изучаю XCode и использую учебники. Я новичок

Я смотрю на этот код и понятия не имею, почему возникает следующая ошибка:

Использование неразрешенного идентификатора 'USER_REF'

но в коде я почти уверен, что ссылаюсь на ПОЛЬЗОВАТЕЛЯ - это правильно?

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

1 Ответ

0 голосов
/ 01 июля 2018

Это прекрасный урок о том, почему важен отступ. После USERPOST_REF: DatabaseReference есть второй }, который завершает область действия class DataService.

В результате createNewAccount(uid:user:) и createNewUserPost(userpost:) являются автономными функциями без доступа к каким-либо элементам экземпляра DatabaseReference.

Несколько улучшений:

  1. Соглашение Swift для всех свойств, экземпляра, класса или статики, должно использовать lowerCamelCase.
  2. В отличие от других языков (здесь я знаю основных нарушителей Java и Ruby), нет смысла создавать переменную экземпляра с открытым геттером (вычисляемое свойство), например filprivate _x: Int, с public var x: Int. А именно, потому что _x не является переменной экземпляра . На самом деле Swift не позволяет создавать переменные экземпляра. Они создаются для вас, когда вы создаете свойства. Что вы делаете, это пишете свойство, которое обращается к объявленному вами свойству, чтобы получить доступ к переменной экземпляра, синтезированной компилятором. Там нет необходимости в этом. Просто сделайте установщик свойства доступным для файла.
  3. Обычное имя синглтона в Swift - shared, default или main. Попробуйте придерживаться одного из них. Кроме того, для того, чтобы у вас действительно был одиночный, вам нужно ограничить доступ к инициализатору, объявив его с 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)
    }
}
...