2017-12-25 36 views
0

Bool型のStringクラスに変数を追加しようとしています。これは、userNameをStringとして使用する場合、Firebaseをチェックしてユーザー名が存在する場合はtrueを返し、そうでない場合はfalseです。最後に、私はこのように使用しようとしています:非同期関数から変数に値を代入する

username.isUserNameAvailable 

私のFirebase関数はデータを非同期的に返します。したがって、以下の私の関数では、変数isTakenには、変数の可用性が関数から返された後に値が割り当てられます。これを修正する方法はありますか?

fileprivate extension String { 
    var isUserNameAvailable : Bool { 
     var availability : Bool? 
     DatabaseManager.system.isUserNameTaken(userName: self, completion: {(isTaken) in 
      availability = !isTaken 
      print("isTaken = \(isTaken)") 
     }) 
     print("availability = \(availability)") 
     return availability! 
    } 
} 
+1

(計算された)プロパティとして宣言できません。 – vadian

答えて

2

非同期コールをすでに利用可能なものとして扱うべきではありません。

Firebaseリクエストが完了したときにコードブロックを呼び出す方法をお勧めします。このような 何か:

fileprivate extension String { 
    func isUserNameAvailable(completion: (Bool)->()) { 
    DatabaseManager.system.isUserNameTaken(userName: self, completion:{(isTaken) in 
     completion(!isTaken) 
    }) 
    } 
} 

あなたはこのようにそれを呼び出します。

string.isUserNameAvailable { (available) in 
    //use the variable 
} 

それはあなたが望んで正確ではありませんが、より明確に呼び出しが非同期であることをビットを見せながら、それはまだコールを簡素化。

関連する問題