2016-04-06 20 views
0

私はまだSwiftを学ぶのが初めてです。私は以下に説明するように、私はまだエラーを取得しています、私はそうしていると信じていますが、それは私がすべてのoptionalsをアンラップする必要があることが示唆されたいくつかの他の記事をレビュー:'(User) - > Dictionary <String、String>'の値を予期した引数型に変換できません 'Dictionary <String、String>'

let user = User(uid: authData.uid! , email: email!, firstName: firstName!, 
     lastName: lastName!, provider: authData.provider!) 

let userDictionary = User.getUserDictionary(user) 

// Add new account to the Firebase database 

UserAccountService.firebaseDBService.createNewAccount(authData.uid, user: userDictionary) 
以下のコードスニペットを考える

行にエラー

Cannot convert value of type '(User) -> Dictionary<String, String>' to 

expected argument type 'Dictionary<String, String>'

を取得 UserAccountService.firebaseDBService.createNewAccount(authData.uid, user: userDictionary)

機能:

func createNewAccount(uid: String, user: Dictionary<String, String>) { 

    // A User is born. 

    USER_REF.childByAppendingPath(uid).setValue(user) 
} 

User.swift:

import Foundation 
import Firebase 

class User: NSObject { 

    let uid: String 
    let email: String 
    let firstName: String 
    let lastName: String 
    let provider: String 

    // Initialize from Firebase 
    init(authData: FAuthData, firstName: String, lastName: String) { 
     self.uid = authData.uid! 
     self.email = authData.providerData["email"] as! String 
     self.firstName = firstName 
     self.lastName = lastName 
     self.provider = authData.provider! 
    } 

    // Initialize from arbitrary data 
    init(uid: String, email: String, firstName: String, lastName: String, provider: String) { 
     self.uid = uid 
     self.email = email 
     self.firstName = firstName 
     self.lastName = lastName 
     self.provider = "" 
    } 

    // Return a Dictionary<String, String> from User object 
    func getUserDictionary(user: User) -> Dictionary<String, String> { 
     //let provider = user.provider as String! 
     let email = user.email as String! 
     let firstName = user.firstName as String! 
     let lastName = user.lastName as String! 
     let userDictionary: [String : String] = [ 
      "provider" : user.provider as String!, 
      "email" : email, 
      "firstName" : firstName, 
      "lastName" : lastName 
     ] 
     return userDictionary 
    } 
} 
+2

'let userDictionary = user.getUserDictionary()'にする必要があります。コードでは大文字と小文字が区別されます。作成したインスタンスの代わりにクラスのメソッドを呼び出そうとしています。 – dan

+0

ありがとう!今私の愚かな間違いを見る。私はこれを見て数時間を費やし、それを捕まえなかった。ありがとう! – Jace

答えて

1

Userニーズ小文字にする 'U' あなたはユーザークラスのインスタンスを参照しているとして、あなたはgetUserMethodを呼び出しますUserクラス自体ではなく、

let user = User(uid: authData.uid! , email: email!, firstName: firstName!, 
    lastName: lastName!, provider: authData.provider!) 

//CHANGE HERE: lowercase u on user 
let userDictionary = user.getUserDictionary(user) 

これが役立つかどうかを確認してください。

+0

ありがとう!今私の愚かな間違いを見る。私はこれを見て数時間を費やし、それを捕まえなかった。ありがとう! – Jace

+0

あなたがそれを受け入れられたと印を付けることができればそれは素晴らしいことでしょう:) –

1

機能あなたが使用した

User.getUserDictionary(user) 

は、実際には、クラスのユーザーの方法です。

これは、クラス自体ではなくインスタンス化したクラスのオブジェクトの1つでメソッドを呼び出す必要があることを意味します。

問題はオプションのアンラッピングに関連しているとは思われません。

+0

ありがとう!今私の愚かな間違いを見る。私はこれを見て数時間を費やし、それを捕まえなかった。ありがとう! – Jace

関連する問題