Ios 无法在swift中比较/返回nil对象
我对Objective-C并不陌生,但我对swift很陌生。我过去常常比较object-C中是否为零,但在swift中我无法做到这一点Ios 无法在swift中比较/返回nil对象,ios,swift,core-data,Ios,Swift,Core Data,我对Objective-C并不陌生,但我对swift很陌生。我过去常常比较object-C中是否为零,但在swift中我无法做到这一点 func getCurrentUser() -> Users{ let fetchRequest = NSFetchRequest(entityName: "Users") var fetchedUsers = NSArray() do { let fetchedEntities = try self.manage
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的解决方案,我得到:
详细说明我的评论,看起来
getCurrentUser
应该返回一个可选的:
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
}
for user in fetchedUsers {
if let currentUser = user as? Users {
if(currentUser.isSignedIn == 1) {
return currentUser
}
}
}
return nil
}
那么你可以称之为:
if let currentUser = UserDBService().getCurrentUser() {
let userID = String(currentUser.userId)
} else {
// no current user
}
详细说明我的评论,看起来
getCurrentUser
应该返回一个可选的:
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
}
for user in fetchedUsers {
if let currentUser = user as? Users {
if(currentUser.isSignedIn == 1) {
return currentUser
}
}
}
return nil
}
那么你可以称之为:
if let currentUser = UserDBService().getCurrentUser() {
let userID = String(currentUser.userId)
} else {
// no current user
}
重写一点你的函数,这应该可以工作
重新编写一点函数,这应该可以工作。您可以通过任何一种方式修复此崩溃
if let currentUser = UserDBService().getCurrentUser() {
let userID = String(currentUser.userId)
} else {
}
或
您可以用任何一种方法修复此崩溃
if let currentUser = UserDBService().getCurrentUser() {
let userID = String(currentUser.userId)
} else {
}
或
删除上下文
如果您使用的是共享上下文,或者您有self.context
则在此处使用self.context
删除
上下文
如果您使用的是共享上下文,或者您有一个self.context
,请在此处使用self.context
。当它崩溃时,您会得到什么调试信息?另一个问题:为什么要获取每个用户,然后检查isSignedIn
属性?为什么不从属性集开始获取实体呢?您似乎不熟悉核心数据,而不仅仅是Swift。如果没有获取的用户,或者没有用户登录,您的getCurrentUser
将返回一个新创建的users
实例。我猜它的userId
属性是nil,并且是强制展开的,这导致了崩溃。Swift中的对象不能包含nil-只有Optionals可以包含nil,并且它们用后缀“?”或“!”声明。当它崩溃时,您会得到什么调试信息?另一个问题:为什么要获取每个用户,然后检查isSignedIn
属性?为什么不从属性集开始获取实体呢?您似乎不熟悉核心数据,而不仅仅是Swift。如果没有获取的用户,或者没有用户登录,您的getCurrentUser
将返回一个新创建的users
实例。我猜它的userId
属性是nil,并且是强制展开的,这导致了崩溃。Swift中的对象不能包含nil-只有Optionals可以包含nil,并且它们用后缀“?”或“!”声明。哪种错误?您是否将返回类型更改为Users?
?否则,我必须返回nil,以便比较fetch请求是否返回了用户。我不明白您在说什么。在我的回答中,当没有用户
找到isSignedIn==1时,它应该返回nil
。它不会检查fetch请求是否返回了任何内容,因为不再需要这些内容了。您是否有理由将此答案删除为已回答并标记了重复内容?这是一个误解。什么类型的错误?您是否将返回类型更改为Users?
?否则,我必须返回nil,以便比较fetch请求是否返回了用户。我不明白您在说什么。在我的回答中,当没有用户
找到isSignedIn==1时,它应该返回nil
。它不会检查fetch请求是否返回了任何内容,因为不再需要这些内容。您是否有理由将此答案删除为已回答并标记了重复内容?这是一个误解。我是否看到了重复内容,或者这与我的答案完全相同,只是有一行错误(返回nil
)额外内容?为什么这个答案甚至被上浮并标记为已回答?我看到的是双倍,还是与我的答案完全相同,只是有一个错误的行(返回nil
)额外?为什么这个答案甚至被上浮并标记为已回答?