Это прекрасный урок о том, почему важен отступ. После USERPOST_REF: DatabaseReference
есть второй }
, который завершает область действия class DataService
.
В результате createNewAccount(uid:user:)
и createNewUserPost(userpost:)
являются автономными функциями без доступа к каким-либо элементам экземпляра DatabaseReference.
Несколько улучшений:
- Соглашение Swift для всех свойств, экземпляра, класса или статики, должно использовать lowerCamelCase.
- В отличие от других языков (здесь я знаю основных нарушителей Java и Ruby), нет смысла создавать переменную экземпляра с открытым геттером (вычисляемое свойство), например
filprivate _x: Int
, с public var x: Int
. А именно, потому что _x
не является переменной экземпляра . На самом деле Swift не позволяет создавать переменные экземпляра. Они создаются для вас, когда вы создаете свойства. Что вы делаете, это пишете свойство, которое обращается к объявленному вами свойству, чтобы получить доступ к переменной экземпляра, синтезированной компилятором. Там нет необходимости в этом. Просто сделайте установщик свойства доступным для файла.
- Обычное имя синглтона в 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)
}
}