如何在 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 的任何实例成员。
几点改进:
- Swift 所有属性、实例、class 或静态的约定是使用 lowerCamelCase。
- 不像其他语言(据我所知,Java 和 Ruby 是这里的主要违规者),没有必要使用 public getter(计算 属性),例如
filprivate _x: Int
,带有 public var x: Int
。也就是说,因为 _x
不是实例变量 。 Swift 实际上并没有让你创建实例变量。它们是在您创建属性时为您生成的。您正在做的是编写一个 属性 来访问您声明的 属性 ,以访问编译器合成的实例变量。没有这个必要。只需将 属性 的 setter 范围设为私有文件即可。
- 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)
}
}
我正在学习 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 的任何实例成员。
几点改进:
- Swift 所有属性、实例、class 或静态的约定是使用 lowerCamelCase。
- 不像其他语言(据我所知,Java 和 Ruby 是这里的主要违规者),没有必要使用 public getter(计算 属性),例如
filprivate _x: Int
,带有public var x: Int
。也就是说,因为_x
不是实例变量 。 Swift 实际上并没有让你创建实例变量。它们是在您创建属性时为您生成的。您正在做的是编写一个 属性 来访问您声明的 属性 ,以访问编译器合成的实例变量。没有这个必要。只需将 属性 的 setter 范围设为私有文件即可。 - 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)
}
}