在尝试获取Struct(Swift)中的变量值时,.Type没有名为“x”的成员

时间:2015-03-05 04:53:22

标签: ios xcode cocoa-touch swift

我目前正在开发一款应用,但我遇到了问题。当用户登录webservice时,如果登录成功,服务器将以JSON响应,我们使用" firstName"和" SecondName"然后创建我们的用户"这是在另一个名为User.swift的文件中定义的结构。然后,我想要做的是使用" firstName"已被赋予"用户结构"在我的主页视图中成功登录后的UILabel。当我尝试给我的标签User.prenom(法语为firstName)时,我收到错误:User.type没有名为...的成员

这是我的代码:

定义登录方法的客户端文件:

import Foundation
import Alamofire
import SwiftyJSON

private let _instance = Client()

class Client {
    // Router is used to do a request to the server.
    private enum Router: URLRequestConvertible {
    private static let baseURL =  "https://mobile.uqam.ca/portail_etudiant/"

        // stores the authentication token.
         static var code_perm: String?
         static var nip:String?

        // Login request.
        case Login(String, String)


        // URLRequestConvertible protocol.
        var URLRequest: NSURLRequest {
            // Returns the path, http method and parameters for the  request.
            var (path: String, method: Alamofire.Method,  parameters: [String: AnyObject]) = {
                switch self {
                case .Login (let code_perm, let nip):
                    let params: [String: AnyObject] = [
                        "code_perm": code_perm,
                        "nip": nip,
                        ]
                    return ("proxy_dossier_etud.php", .POST, params)


                }
            }()

            // Setup the URLRequest.
            let url = NSURL(string: Router.baseURL)
            let urlRequest = NSMutableURLRequest(URL: url!.URLByAppendingPathComponent(path))
            urlRequest.HTTPMethod = method.rawValue
            if let code_perm = Router.code_perm {
                if let nip = Router.nip{

                parameters["nip"] = nip
                parameters["code_perm"] = code_perm
                }
            }

            let encoding = Alamofire.ParameterEncoding.URL

            return encoding.encode(urlRequest, parameters: parameters).0
        }
    }

    // Singleton
    class var sharedInstance: Client {
        return _instance
    }
    private init() {}



    // Login logs in the user with his email and password.
    func login(code_perm:String, nip:String, callback:(LoginResponse?) -> Void) {
        Alamofire.request(Router.Login(code_perm, nip)).responseJSON { (_, _, data, error) in
            if(error != nil) {
                callback(nil)
                return
            }

            var json = JSON(data!)

            let prenom = json["socio"]["prenom"].stringValue
            let nom = json["socio"]["nom"].stringValue

            Router.code_perm = code_perm
            Router.nip = nip

            callback(LoginResponse(
                user: User(prenom: prenom,nom: nom)
            ))
        }
    }
}

登录函数调用的loginViewController

    import UIKit

class LoginViewController: UIViewController {

    @IBOutlet weak var LoginScreenImage: UIImageView!

    @IBOutlet weak var codeTextField: UITextField!

    @IBOutlet weak var nipTextField: UITextField!

    @IBOutlet weak var loadingLogin: UIActivityIndicatorView!

    let client = Client.sharedInstance

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        LoginScreenImage.image = UIImage(named: "UQAMLOGO")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


        @IBAction func connect() {
        let code_perm = codeTextField.text
        let nip = nipTextField.text
        self.loadingLogin.startAnimating()

        if code_perm != "" && nip != "" {
            client.login(code_perm, nip: nip, callback: { (response) in
                if let response = response {

                        self.loadingLogin.stopAnimating()
                        let homeViewController = self.storyboard!.instantiateViewControllerWithIdentifier("HomeViewController") as HomeViewController

                        self.showViewController(homeViewController, sender: self)

                } else {
                    self.loadingLogin.stopAnimating()
                    let badLogin = UIAlertController(title: "Échec de connexion", message: "La combinaison du code permanent et du nip n'est pas bonne", preferredStyle: .Alert)
                    let reessayer = UIAlertAction(title: "Réessayer", style: .Default, handler: { (reessayer) -> Void in
                        self.dismissViewControllerAnimated(true , completion: nil)
                    })
                    badLogin.addAction(reessayer)

                    self.presentViewController(badLogin, animated: true, completion: nil)

                }
            })
        }
    }


}

User.swift,而用户结构是

    import Foundation

struct User {
    var prenom :String
    var nom: String

}

struct LoginResponse {

    var user: User
}

最后是HomePageViewController,我尝试将值赋给我的标签:

import UIKit


class HomeViewController: UIViewController {


    @IBOutlet weak var schedule: UIImageView!

    @IBOutlet weak var courses: UIImageView!

    @IBOutlet weak var email: UIImageView!

    @IBOutlet weak var grades: UIImageView!

    @IBOutlet weak var bienvenueLabel: UILabel!



    let client = Client.sharedInstance

    override func viewDidLoad() {



        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        schedule.image = UIImage(named:"schedule")
        courses.image = UIImage(named: "courses")
        email.image = UIImage(named:"mail")
        grades.image = UIImage(named:"grades")
        bienvenueLabel.text = User.prenom


    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

感谢大家的帮助,祝你有一个美好的一天

查尔斯

2 个答案:

答案 0 :(得分:0)

您正在访问该类而不是实例。相反,您应该将响应实例传递给HomeViewController

class HomeViewController : .. {
  // ...
  var loginResponse : LoginResponse
  // ...

  override func viewDidLoad() {
    // ...
    bienvenueLabel.text = loginResponse.user.prenom
  }
}

  // ...
  client.login(code_perm, nip: nip, callback: { (response) in
            if let loginResponse = response as LoginResponse {

                    self.loadingLogin.stopAnimating()
                    let homeViewController = self.storyboard!.instantiateViewControllerWithIdentifier("HomeViewController") as HomeViewController

                    homeViewController.loginResponse = loginResponse
                    // assign your instance ^^^^^^^^^^^^^^^^^^^^^^^^

                    self.showViewController(homeViewController, sender: self)

            }

答案 1 :(得分:0)

您正在访问该类而不是实例。相反,您应该将响应实例传递给HomeViewController

class HomeViewController : .. {
  // ...
  var loginResponse : LoginResponse
  // ...

  override func viewDidLoad() {
    // ...
    bienvenueLabel.text = loginResponse.user.prenom
  }
}

  // ...
  client.login(code_perm, nip: nip, callback: { (response) in
            if let loginResponse = response as LoginResponse {

                    self.loadingLogin.stopAnimating()
                    let homeViewController = self.storyboard!.instantiateViewControllerWithIdentifier("HomeViewController") as HomeViewController

                    homeViewController.loginResponse = loginResponse
                    // assign your instance ^^^^^^^^^^^^^^^^^^^^^^^^

                    self.showViewController(homeViewController, sender: self)

            }

这确实不是很好的结构,但它至少应该回答你的问题。