【问题标题】:Unable to compare/return nil object in swift无法快速比较/返回零对象
【发布时间】: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,并且它们以“?”后缀声明。或“!”。

标签: ios swift core-data


【解决方案1】:
func getCurrentUser() -> Users? {
    let fetchRequest = NSFetchRequest(entityName: "Users")
    let fetchedUsers = (try? managedobjectContext.executeFetchRequest(fetchRequest)) as? [Users] ?? []

    // If there are no instances of Users with isSignedIn == 1, it returns nil
    guard let index = fetchedUsers.indexOf({ $0.isSignedIn == 1 }) else { return nil }

    // Since it passed the guard, it can return the user
    return fetchedUsers[index]
}

// Returns an optional String
let userID = String(getCurrentUser()?.userID)

稍微改写一下你的函数,应该可以工作了。

【讨论】:

  • 什么样的错误?你把返回类型改成Users?了吗?
  • 否则,我必须返回 nil,这样我才能比较 fetch 请求是否返回了用户。
  • 我不明白你在说什么。在我的回答中,当isSignedIn == 1 没有找到Users 时,它应该返回nil。它不会检查 fetch 请求是否返回任何内容,因为不再需要。
  • 您是否有理由将此答案删除为已回答并改为标记重复项?
  • 那是个误会。
【解决方案2】:

详细说明我的评论,看起来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
}

【讨论】:

    【解决方案3】:

    您可以通过任何方式修复此崩溃

    if let currentUser = UserDBService().getCurrentUser() {
        let userID = String(currentUser.userId)
    } else {
    
    }
    

     let currentUser = UserDBService().getCurrentUser()
         if(currentUser!=nil){
            let userID = String(currentUser.userId)
         }else{
            // Nil handling code
         }
    

    【讨论】:

      【解决方案4】:
          func getCurrentUser() -> Users? {
              let fetchRequest = NSFetchRequest(entityName: "Users")
              let fetchedUsers = (try? managedobjectContext.executeFetchRequest(fetchRequest)) as? [Users] ?? []
      
           returns nil
              guard let index = fetchedUsers.indexOf({ $0.isSignedIn == 1 }) 
              else 
              { 
                  return nil 
              }
      
              return fetchedUsers[index]
          }
      
      //Call your method like this
      let userID = String(getCurrentUser(context)?.userID)
      

      如果您正在使用共享上下文或者您正在使用 self.context,请删除 context,然后在此处使用 self.context

      【讨论】:

      • 我看到的是双倍的,还是这与我的答案完全相同,除了有一条错误的线路 (returns nil) 额外?为什么这个答案甚至被投票并标记为已回答?
      猜你喜欢
      • 2020-08-07
      • 2013-10-12
      • 1970-01-01
      • 2010-10-25
      • 2021-02-07
      • 2011-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多