2016-03-21 29 views
0

我对Objective-C并不陌生,但我对swift很陌生。我曾经比较过Objective-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是零,我无法检查它的方法调用,代码崩溃。

这是我的代码崩溃:

let currentUser = UserDBService().getCurrentUser() 

    let userID = String(currentUser.userId) 

我可怎么办呢?

UPDATE

我用迈克尔的答案,但我仍然得到崩溃:

enter image description here

曾用Eendje的解决方案,我得到这个:

enter image description here

+0

当它崩溃时,你会得到哪些调试信息? – Avi

+0

另一个问题:为什么要抓取每个用户然后检查'isSignedIn'属性?为什么不只是获取具有该属性集的实体?看起来你是核心数据的新手,而不仅仅是Swift。 – Avi

+0

如果没有提取的用户,或者没有用户登录,那么'getCurrentUser'将返回一个新创建的'Users'实例。我猜它是'userId'属性是零,并且是强制解包导致崩溃。 Swift中的对象不能包含nil - 只有Optionals可以包含nil,并且它们声明后缀为“?”要么 ”!”。 – Michael

回答

3
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) 

重写了你的函数一点,这应该是能正常工作。

+0

编译器在这个'{return nil}'上发生错误' – iBug

+0

什么样的错误?你是否将返回类型更改为'Users?'? – Eendje

+0

否则,我必须返回零,所以我可以比较如果获取请求已经返回一个用户或什么都没有。 – iBug

1

诠根据我的评论,它看起来像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 
} 
1

您可以修复此故障无论哪种方式

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

} 

OR

let currentUser = UserDBService().getCurrentUser() 
    if(currentUser!=nil){ 
     let userID = String(currentUser.userId) 
    }else{ 
     // Nil handling code 
    } 
0
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然后使用self.context这里取下context

+1

我看到的是双倍的,还是与我的答案完全一样,除了有一个错误的行('returns nil')?为什么这个答案甚至被提高并被标记为回答? – Eendje