2016-10-22 7 views
0

Я извлекаю Array в Swift из PHP, который содержит значения из нескольких SQL-запросов.Как распаковать массив из php в Swift через JSON

Массив послали, получил и отпечатано в Swift по следующему коду:

let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in 
DispatchQueue.main.async 
{ 

let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] 

print (json) 
} 

Массив содержит userDetails и Communities и его выход в Xcode (через напечатанной отладки) выглядит следующим образом:

Optional(["userDetails": { 
id = 2; 
"user_email" = "[email protected]"; 
"user_name" = "<null>"; 
}, "communities": <__NSArrayI 0x60000002f500>(
{ 
name = Gallelio; 
}, 
{ 
name = GallelioPart2; 
} 
) 
]) 
Optional(["userDetails": { 
id = 30; 
"user_email" = "[email protected]"; 
"user_name" = "Samuel Bawdry"; 
}, "communities": <__NSArrayI 0x60800026e180>(
{ 
name = TesetTester; 
}, 
{ 
name = Westbrook2; 
}, 
{ 
name = WinnersOnly; 
}, 
{ 
name = OneTwoThree; 
}, 
{ 
name = WhoopdeWhoop; 
} 
) 
]) 

Как мне теперь распаковать содержимое «сообществ», чтобы я мог отображать его содержимое в UITableVIew. У меня есть UITableView, уже настроенный и работающий с «фиктивными данными».

Это полный Swift Сценарий:

import UIKit 

protocol UsernameSentDelegate { 
func userLoggedIn(data: String) 
} 

class LoginViewController: UIViewController { 

var delegate: UsernameSentDelegate? = nil 

@IBOutlet weak var userEmailTextField: UITextField! 
@IBOutlet weak var userPasswordTextField: UITextField! 
@IBOutlet weak var displayUserName: UILabel! 
var communitiesArray = [String]() 


@IBAction func loginButtonTapped(_ sender: AnyObject) 
{ 

    let userEmail = userEmailTextField.text; 
    let userPassword = userPasswordTextField.text; 

    if (userPassword!.isEmpty || userEmail!.isEmpty) { return; } 

// send user data to server side 


    let myUrl = URL(string: "http://www.quasisquest.uk/KeepScore/userLogin.php"); 

    var request = URLRequest(url:myUrl!); 

    request.httpMethod = "POST"; 

    let postString = "email=\(userEmail!)&password=\(userPassword!)"; 

    request.httpBody = postString.data(using: String.Encoding.utf8); 

    let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in 
     DispatchQueue.main.async 
      { 


       if(error != nil) 
       { 

        //Display an alert message 
        let myAlert = UIAlertController(title: "Alert", message: error!.localizedDescription, preferredStyle: UIAlertControllerStyle.alert); 
        let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler:nil) 
        myAlert.addAction(okAction); 
        self.present(myAlert, animated: true, completion: nil) 
        return 
       } 

       do { 

        let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] 

        if let arr = json?["communities"] as? [String:String] { 
        self.communitiesArray = arr.map { $0["name"] } 
       } 


        // retrieve login details and check to see if all ok 

        if let parseJSON = json { 

         let returnValue = parseJSON["status"] as? String 

         if(returnValue != "error") 
         { 

          self.delegate?.userLoggedIn(data: userEmail!) 

          UserDefaults.set(UserDefaults.standard)(true, forKey: "isUserLoggedIn"); 


          self.dismiss(animated: true, completion: nil) 


         } else { 
          // display an alert message 
          let userMessage = parseJSON["message"] as? String 
          let myAlert = UIAlertController(title: "Alert", message: userMessage, preferredStyle: UIAlertControllerStyle.alert); 
          let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler:nil) 
          myAlert.addAction(okAction); 
          self.present(myAlert, animated: true, completion: nil) 
         } 

        } 
       } catch 
       { 
        print(error) 
       } 


     } 



    } 

    task.resume() 


} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
{ 

    if segue.identifier == "loginView" { 
     let createViewController: ViewController = segue.destination as! ViewController 
     createViewController.communities = communitiesBox 
     print (communitiesBox) 
    } 


} 



} 
+0

', если позволяют сообщества = [«JSON сообщества»] как массив <Словарь > {// у вас есть сообщества, как массив и загрузить его с помощью представления таблицы методы ...} ' –

+0

https://www.raywenderlich.com/120442/swift-json-tutorial Я считаю полезным для вас – seggy

ответ

2

Вы можете сделать, что с помощью двух способов.

Объявите один Array типа [[String:String]] и используйте его с вашим TableView.

var communitiesArray = [[String:String]]() 

let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in 

    let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] 
    if let arr = json["communities"] as? [[String:String]] { 
     self.communitiesArray = arr 
    }  
    DispatchQueue.main.async { 
     self.tableView.reloadData() 
    } 

Сейчас в tableView наборе метод используют communitiesArray как cell.label.text = self.communitiesArray[indexPath.row]["name"]

Если вы получаете только name значение с communities то тесто, если вы создаете только массив типа [String], как это.

var communitiesArray = [String]() 

let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in 

    let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] 
    if let arr = json["communities"] as? [[String:String]] { 
     self.communitiesArray = arr.flatMap { $0["name"]} 
    }  
    DispatchQueue.main.async { 
     self.tableView.reloadData() 
    } 

Сейчас в tableView метод набора использования communitiesArray как cell.label.text = self.communitiesArray[indexPath.row]

+0

Я получаю сообщение об ошибке« Тип »(ключ: String, value: String) 'имеет ни один из участников индекса. На строке self.communitiesArray = arr.map ... Это также заставило меня поставить «in json? [« community »] - это правильно? – RDowns

+0

Отлично! добавлений xCode хотел сделать (? после json,! после ["name"], но похоже, что он работает хорошо! ура – RDowns

 Смежные вопросы

  • Нет связанных вопросов^_^