2016-09-20 2 views
0

Ich bin also auf ein kleines Hindernis gestoßen und versuche auf eine Variable zuzugreifen, die in einer Alamofire-Anforderungsfunktion erstellt wurde. Ein bisschen Hintergrund in:Zugriff auf eine tief in einer Funktion verborgene Variable außerhalb der Funktion in Swift 2

SwiftyJSON/Alamofire auf JSON-Datei zugreifen und analysieren, haben eine Variable für ein Zugriffsdatum, aber das Datum war im RFC 3339-Format und jetzt habe ich eine Funktion zum Parsen des Datums von RFC 339 erstellt zu einem lesbaren Format, aber ich nicht jetzt, wie man auf die Datumsvariable zugreift, die in der JSON-Analysefunktion geschaffen wird, um mit der Datumsanalysefunktion zu verwenden.

//Get the JSON from server 
func getJSON() { 

    Alamofire.request(.GET, "link goes here").responseJSON { (Response) in 

     if let value = Response.result.value { 

      let json = JSON(value) 

      for anItem in json.array! { 

       let title: String? = anItem["Title"].stringValue 
       let date: String? = anItem["Date"].stringValue //trying to access this variable outside the function 
       let body: String? = anItem["Body"].stringValue 
       self.tableTitle.append(title!) 
       self.tableDate.append(date!) 
       self.tableBody.append(body!) 
       print(anItem["Title"].stringValue) 
       print(anItem["Date"].stringValue) 

      } 

      dispatch_async(dispatch_get_main_queue()) { 

       self.tableView.reloadData() 

      } 

     } 

    } 

} 

// this date stuff isn't being used yet, because I have no idea how... 
public func dateForRFC3339DateTimeString(rfc3339DateTimeString: String) -> NSDate? { 

    let enUSPOSIXLocale = NSLocale(localeIdentifier: "en_US_POSIX") 

    let rfc3339DateFormatter = NSDateFormatter() 
    rfc3339DateFormatter.locale = enUSPOSIXLocale 
    rfc3339DateFormatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'" 
    rfc3339DateFormatter.timeZone = NSTimeZone(forSecondsFromGMT: 0) 

    return rfc3339DateFormatter.dateFromString(rfc3339DateTimeString) 
} 

public func userVisibleDateTimeStringForRFC3339DateTimeString(rfc3339DateTimeString: String) -> String? { 

    let maybeDate = dateForRFC3339DateTimeString(rfc3339DateTimeString) 
    if let date = maybeDate { 

     let userVisibleDateFromatter = NSDateFormatter() 
     userVisibleDateFromatter.dateStyle = NSDateFormatterStyle.MediumStyle 
     userVisibleDateFromatter.timeStyle = NSDateFormatterStyle.ShortStyle 

     return userVisibleDateFromatter.stringFromDate(date) 

    } else { 

     return nil 

    } 

} 

let finalDateStr = userVisibleDateTimeStringForRFC3339DateTimeString(MasterViewController) //now this is where it gets weird, instead of letting me enter the string in the brackets, it defaults to MasterViewController, now I tried to move the date functions to another .swift file (an empty one) and it doesn't do that anymore 

Also ja, das ist es, wenn jemand helfen könnte, würde es sehr geschätzt werden.

+0

Können Sie nicht verwenden: 'lassen convertedDate = dateForRFC3339DateTimeString (rfc3339DateTimeString: anItem ["Datum"]. stringValue) 'anstelle von' let date: String? = anItem ["Date"]. stringValue' – Santosh

+0

@Santosh Versuchte das, gab mir ein "kann Wert des Typs 'NSDate' nicht umwandeln, um 'Zeichenkette?' zu schreiben. So entfernte ich es und jetzt gibt es mir 'kann einen Werttyp nicht einstufen 'JSON' mit einem Index vom Typ 'String' ' – omar

+0

Probieren Sie einfach 'anItem [" Date "]' und Sie müssen Ihre Methode ändern, um 'NSDate' als Parametertyp zu akzeptieren und die Definition entsprechend zu ändern – Santosh

Antwort

0

unten Code Versuchen, lassen Sie mich wissen, ob es funktioniert:

func dateForRFC3339Date(rfc3339Date: NSDate) -> NSDate? { 
     let enUSPOSIXLocale = NSLocale(localeIdentifier: "en_US_POSIX") 
     let rfc3339DateFormatter = NSDateFormatter() 
     rfc3339DateFormatter.locale = enUSPOSIXLocale 
     rfc3339DateFormatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'" 
     rfc3339DateFormatter.timeZone = NSTimeZone(forSecondsFromGMT: 0) 
     let dateString = rfc3339DateFormatter.stringFromDate(rfc3339Date) 
     return rfc3339DateFormatter.dateFromString(dateString) 
    } 

Und es in Ihrem getJSON() Methode aufrufen, wie:

let convertedDate = self.dateForRFC3339Date(rfc3339Date: anItem["Date"])

+0

es gibt mir das gleiche error "Kann keinen Werttyp 'JSON' mit einem Index vom Typ 'String' indizieren." Aber ich habe ein wenig gesucht und es sieht so aus, als ob SwiftyJSON es möglich macht. Ich werde es versuchen und sehen, was passiert – omar

Verwandte Themen