2016-03-21 12 views
0

私はObjective-Cの新機能ではありませんが、私は迅速です。私はObjective-Cで無かったらオブジェクトを比較していましたが、すぐにはできません。即時にnilオブジェクトを比較/返すことができません

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) 

UPDATE

私はマイケルの答えを使用しているが、それでも私はクラッシュを取得:

enter image description here

はEendjeのソリューションを使用していると私はこの取得:

enter image description here

+0

クラッシュするとどのようなデバッグ情報が得られますか? – Avi

+0

別の質問:すべてのユーザーを取得してから、isSignedInプロパティをチェックする理由は何ですか?なぜ、そのプロパティを持つエンティティを最初にフェッチするだけではないのですか? Swiftだけではなく、あなたがコアデータに慣れていないようです。 – Avi

+0

フェッチされたユーザーがない場合、または誰もログインしていない場合、 'getCurrentUser'は新しく作成された' Users'インスタンスを返します。私は 'userId'プロパティがnilであり、クラッシュを引き起こしている強制アンラップされていると推測しています。 Swiftのオブジェクトはnilを含むことはできません - オプションは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

それ以外の場合、フェッチ要求がユーザーを返したかどうかを比較できるようにnilを返す必要があります。 – iBug

1

エラボレーションを私のコメントでは、それはのように見えますは、オプションを返す必要があります:

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

私はダブルを見ていますか?これは私の答えとまったく同じですが、間違った行( '' nil'を返します)を余分に持っていること以外は?なぜこの答えは、アップホートされ、答えとしてマークされていますか? – Eendje