2016-05-06 5 views
0

Ich versuche, Daten von meiner Data-Klasse an meine Login-Klasse übergeben (beide Dateien sind separat.), Aber es wirft 2 Fehler aus der "Login" -Klasse, wie es scheint nicht zu empfangenProblem beim Übergeben von Daten zwischen Klassen

Daten

im Folgenden werden die Fehler in Login.swift gezeigt:

Fehler 1

Instanz Mitglied 'DataObj' kann nicht auf Typ 'Login'

verwendet werden

Fehler 2

Erwartete Erklärung

Login.swift Code

import Foundation 
import Alamofire 
import SwiftyJSON 
class Login {let dataObj = Data(userName: "username", passWord: "password") 

let endPoint = dataObj.todoEndPoint 
let parameters = [ 
    "username": dataObj.userName, 
    "password": dataObj.passWord 
] 

Alamofire.request(.POST, endPoint, parameters:parameters) 
.responseJSON { response in 
print(response.request) 
print(response.response) 
print(response.result) 
if let JSON = response.result.value { 
print("Did receive JSON data: \(JSON)") 
} 
else { 
print("JSON data is nil.") 
} 
} 
} 

Data.swift Code

import Foundation 
import Alamofire 
import SwiftyJSON 

class Data { 

var userName:String! 
var passWord:String! 
let todoEndpoint: String = "http://jsonplaceholder.typicode.com/todos/1" 

init(userName : String, passWord : String) { 
    self.userName = userName 
    self.passWord = passWord 
} 
} 

Screenshot von Fehlern

Login.swift errors

+0

Ich weiß nicht viel über Swift, aber sollten Sie nicht zuerst ein "Data" -Objekt instanziieren, bevor Sie auf die Variablen zugreifen können? –

Antwort

0

Sie müssen nur die Instanz Eigenschaft auf Klasseneigenschaft Daten ändern, indem Sie mit statischen

class Data { 

static var userName:String! 
static var passWord:String! 
static let todoEndpoint: String = "http://jsonplaceholder.typicode.com/todos/1" 

} 

und direkte Werte in userName und passWord gesetzt.

in von Login-Sollwert

Data.userName = "yourusername" 
Data.passWord = "password" 

2. oder Sie können auch Datenobjekt erstellen

class Data { 

var userName:String! 
var passWord:String! 
let todoEndpoint: String = "http://jsonplaceholder.typicode.com/todos/1" 

init(userName : String, passWord : String) { 

self.userName = userName 
self.passWord = passWord 
} 

und in Login-Klasse

class Login { 
static let dataObj = Data(userName: "usename", passWord: "password") 

lazy var endPoint = Login.dataObj.todoEndpoint 

let parameters = [ 
      "username": dataObj.userName, 
      "password": dataObj.passWord 
] 


func getRequest() { 

Alamofire.request(.POST, endPoint, parameters:parameters) 
    .responseJSON { response in 
     print(response.request) 
     print(response.response) 
     print(response.result) 
     if let JSON = response.result.value { 
      print("Did receive JSON data: \(JSON)") 
     } 
     else { 
      print("JSON data is nil.") 
     } 
} 
} 

} 

AKTUALISIERT

Ich denke, Sie sollten ein Singleton-Objekt erstellen, um die Werte von Benutzern überall zu erhalten.

class Data { 

static let sharedInstance = Data() 
static let todoEndpoint: String = "http://jsonplaceholder.typicode.com/todos/1" 
var userName: String? 
var passWord: String? 

// for prevent from creating this class object 
private init() { } 

} 

Und in der Login-Klasse.

class Login { 

init(userName: String, passWord: String) { 
Data.sharedInstance.userName = userName 
Data.sharedInstance.passWord = passWord 
    } 

/// call this method to login 
func getRequest() { 
print(Data.sharedInstance.userName) 
print(Data.sharedInstance.passWord) 

Alamofire.request(.POST, Data.endPoint, parameters: ["userName": Data.sharedInstance.userName, "passWord": Data.sharedInstance.passWord]) 
.responseJSON { response in 
print(response.request) 
print(response.response) 
print(response.result) 
if let JSON = response.result.value { 
print("Did receive JSON data: \(JSON)") 
} 
else { 
print("JSON data is nil.") 
} 

} 

} 
} 

Und von einer anderen Klasse eine Log-Instanz erstellen und userName und Password Werte von dort passieren und getRequest Methode Anmeldung Objekt aufrufen.

+0

Hallo @Sahil Beri Ich habe versucht, Ihrer Lösung zu folgen, aber mein Login.swift-Code wirft jetzt einige neue Fehler auf, wie in meinem aktualisierten Beitrag gezeigt. Weißt du, wie ich es beheben kann? – noobdev

+0

Verwenden Sie 'lazy var endPoint = dataObj.todoEndpoint' und erstellen Sie ein Singleton-Datenobjekt, und ein zweiter Fehler wird ausgelöst, da Sie eine Feueranforderung im Klassenbereich sind. Erstellen Sie eine Methode und rufen Sie sie von irgendwo an. – Sahil

+0

Ich bekomme ein "Instanz-Mitglied 'EndPoint' kann nicht verwendet werden Typ" Login "Fehler jetzt an meiner AlamoFire-Anforderungsleitung. Wie kann ich es beheben? – noobdev

0

Nach Ihrer Data Klasse Umsetzung sollte es Ihnen gefällt verwenden:

class Login { 
let dataObj = Data(userName : "username", passWord : "password") 
let endPoint = dataObj.todoEndPoint 
let parameters = [ 
       "username": dataObj.userName, 
       "password": dataObj.passWord 
    ] 

    Alamofire.request(.POST, endPoint, parameters:parameters) 
     .responseJSON { response in 
      print(response.request) 
      print(response.response) 
      print(response.result) 
      if let JSON = response.result.value { 
       print("Did receive JSON data: \(JSON)") 
      } 
      else { 
       print("JSON data is nil.") 
      } 

    } 

    } 

Wenn Sie statische Daten aus Data dann singleton/shared instance verwenden erhalten möchten.

+0

Hallo @Muhammad Yawar Ali Ich habe versucht, Ihre Lösung zu folgen und wurde ein paar "Instanz Mitglied kann nicht auf Typ Instanz Fehler verwendet werden" in meinem Login.swift geworfen. Kannst du mir bitte sagen, wie ich sie lösen kann? – noobdev

+0

versuchen 'Lazy Let EndPoint = dataObj.todoEndPoint' –

+0

Sicher, das half mit der" Instanz Mitglied kann nicht auf Typ-Instanz "-Fehler verwendet werden, aber ich bin immer noch die" erwartete Deklaration "Fehler neben meiner Alamofire.request Zeile – noobdev