2016-10-12 3 views
0

Ich versuche herauszufinden, wie Klassen in swift arbeiten. Ich habe die Klassen doc auf dev.apple gelesen, aber es gibt wahrscheinlich etwas Wesentliches, das ich nicht verstehe. Schätzen Sie die Hilfe und wenn möglich, eine Klarstellung darüber, wie das funktionieren soll.Klassenverständnis: Unerwarteter void-Rückgabewert in der void-Funktion (swift 3)

Ich bin nicht in der Lage, das JSON-Objekt von dieser Funktion zurück, wenn getData.connect

Fehler ausgeführt wird: getData.swift:39:20: Unexpected non-void return value in void function

import UIKit 
import Alamofire 
import SwiftyJSON 

public class getData: NSObject { 
    public func connect(url: String, devhostname: String, hostname: String, username: String, password: String) -> Array<JSON> { 
     let serverTrustPolicies: [String: ServerTrustPolicy] = [ 
      hostname: .pinCertificates(
       certificates: ServerTrustPolicy.certificates(), 
       validateCertificateChain: false, 
       validateHost: true 
      ), 
      devhostname: .disableEvaluation 
     ] 

     let sessionManager = Alamofire.SessionManager(
      serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies) 
     ) 

     var headers: HTTPHeaders = [:] 

     if let authorizationHeader = Request.authorizationHeader(user: username, password: password) { 
      headers[authorizationHeader.key] = authorizationHeader.value 
     } 

     sessionManager.request(url, headers: headers).responseJSON { response in 

      let data = response.data! 
      let json = JSON(data: data) 

      return json 

      sessionManager.session.invalidateAndCancel() 
     } 
    } 
} 

Antwort

0

Sie Methode muss ein Array<JSON> Objekt zurückgeben:

public func connect(url: String, devhostname: String, hostname: String, username: String, password: String) -> Array<JSON> 

Aber dieser Code wird asynchron ausgeführt:

sessionManager.request(url, headers: headers).responseJSON { response in 

    let data = response.data! 
    let json = JSON(data: data) 

    return json 

    // this line is never executed too.. 
    sessionManager.session.invalidateAndCancel() 
} 

Also wird Ihre Methode nie das erwartete Array zurückgeben. Sie müssen die return-Anweisung aus der Methodendeklaration entfernen und die asynchrone Antwort mithilfe von Protocols/Listeners oder CompletionHandlers verwalten.

0

.responseJSON ist asynchron, und Sie können Ihre Daten nicht einfach an die aufrufende Funktion oder über return in .responseJSON Rückruf zurückgeben.

Sie können den Rückgabetyp Ihrer connect-Funktion entfernen und Daten mit dem Rückruf vom Typ [JSON] -> Void zurückgeben.