【发布时间】:2023-03-13 09:10:02
【问题描述】:
我不是 Objective-C 的新手,但我是 swift 的新手。如果它们在 Objective-C 中为零,我曾经比较对象,但我无法迅速做到这一点。
func getCurrentUser() -> Users{
let fetchRequest = NSFetchRequest(entityName: "Users")
var fetchedUsers = NSArray()
do {
let fetchedEntities = try self.managedObjectContext.executeFetchRequest(fetchRequest) as NSArray
fetchedUsers = fetchedEntities
} catch {
// Do something in response to error condition
}
var userToSend = Users()
for user in fetchedUsers{
let currentUser = user as! Users
if(currentUser.isSignedIn == 1)
{
userToSend = currentUser
break
}
}
return userToSend
}
如果我的 userToSend 为 nil,我无法检查调用该方法的位置,代码崩溃。
这是我的代码崩溃的地方:
let currentUser = UserDBService().getCurrentUser()
let userID = String(currentUser.userId)
我该怎么做?
更新
我使用了迈克尔的答案,但仍然崩溃:
使用了 Eendje 的解决方案,我明白了:
【问题讨论】:
-
当它崩溃时你会得到什么调试信息?
-
另一个问题:为什么要获取每个用户然后检查
isSignedIn属性?为什么不直接获取具有该属性设置的实体呢?看来您是核心数据的新手,而不仅仅是 Swift。 -
如果没有获取到的用户,或者没有用户登录,您的
getCurrentUser将返回一个新创建的Users实例。我猜它的userId属性是 nil 并且是强制展开的,这会导致崩溃。 Swift 中的对象不能包含 nil - 只有 Optionals 可以包含 nil,并且它们以“?”后缀声明。或“!”。