Ios 无法在swift中比较/返回nil对象

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

我对Objective-C并不陌生,但我对swift很陌生。我过去常常比较object-C中是否为零,但在swift中我无法做到这一点

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
)额外?为什么这个答案甚至被上浮并标记为已回答?