/ / Dostęp do tablic w słowniku - szybki

Dostęp do tablic w słowniku - szybki

Jestem nowy na IOS, więc to pytanie może być dla początkujących. Wiem dokładnie, co chcę zrobić, ale pytanie, jak to zrobić. Mam dane JSON ze słownika

{
"restaurants": [
{
"id": 1,
"restaurantName": "Chuks",
"restaurantPicture": "restaurantImages/benards.jpg",
"status": "Working",
"workingDays": "Tuesday to Sunday",
"workingHours": "3pm to 10pm"
},
{
"id": 3,
"restaurantName": "Chuks",
"restaurantPicture": "restaurantImages/benards.jpg",
"status": "Working",
"workingDays": "Tuesday to Sunday",
"workingHours": "3pm to 10pm"
},
{
"id": 4,
"restaurantName": "Chuks",
"restaurantPicture": "restaurantImages/benards.jpg",
"status": "Working",
"workingDays": "Tuesday to Sunday",
"workingHours": "3pm to 10pm"
},
{
"id": 5,
"restaurantName": "Chuks",
"restaurantPicture": "restaurantImages/benards.jpg",
"status": "Working",
"workingDays": "Tuesday to Sunday",
"workingHours": "3pm to 10pm"
},
{
"id": 6,
"restaurantName": "Chuks",
"restaurantPicture": "restaurantImages/benards.jpg",
"status": "Working",
"workingDays": "Tuesday to Sunday",
"workingHours": "3pm to 10pm"
}
]
}

Próbuję uzyskać dostęp do tablic w słowniku za pomocą tego kodu

override func viewDidLoad() {
super.viewDidLoad()

Alamofire.request(URL_GET_DATA).responseJSON { response in

if let json = response.result.value {

let RestaurantArray : NSArray = json as! NSArray

for i in 0..<RestaurantArray.count{

self.restaurant.append(Restaurant(
restaurantPicture: (RestaurantArray[i] as AnyObject).value(forKey: "restaurantPicture") as? String,
restaurantName: (RestaurantArray[i] as AnyObject).value(forKey: "restaurantName") as? String,
status: (RestaurantArray[i] as AnyObject).value(forKey: "status") as? String
))

}

self.tableViewRestaurants.reloadData()
}

}
self.tableViewRestaurants.reloadData()
}

i otrzymuję ten błąd

Could not cast value of type "__NSSingleEntryDictionaryI" (0x1032e6e98) to "NSArray" (0x1032e7f28).
2018-04-16 11:58:29.020876+0000 restaurant[6262:210307] Could not cast value of type "__NSSingleEntryDictionaryI" (0x1032e6e98) to "NSArray" (0x1032e7f28).

Wiem, co próbuję zrobić, uzyskując dostęp dotablice w słowniku, ale problem polega na tym, jak to zrobić. Wszystkie pomoc i krytyka są mile widziane, ponieważ jestem gotów się uczyć. Czy istnieje sposób, w jaki mogę próbować uzyskać tylko tablice z bazy danych bez tego w słowniku restauracji. Dziękuje wszystkim

Odpowiedzi:

0 dla odpowiedzi № 1
//As per above response


override func viewDidLoad() {
super.viewDidLoad()

Alamofire.request(URL_GET_DATA).responseJSON { response in

if let json = response.result.value as! NSDictionary {

let restaurantsArray = json["restaurants"] as! NSArray

for dict in restaurantsArray {

let ID = (dict as! NSDictionary).value(forKey: "id") as? Int
//You can get more data like above
}

self.tableViewRestaurants.reloadData()
}
}
}

0 dla odpowiedzi nr 2

Nie można przesłać wartości typu "__NSSingleEntryDictionaryI" (0x1032e6e98) do "NSArray" (0x1032e7f28)

To wyraźnie potwierdza ten stan response.result.value jest słownikiem, a nie tablicą.


FYI:

Słownik jest reprezentowany przez { } i tablica wg [ ] w JSON.


Zaktualizuj swój kod w następujący sposób:

    if let json = response.result.value as? [String: Any], let arr = json["restaurants"] as? [[String: Any]] {
let RestaurantArray: [[String: Any]] = arr

for dict in RestaurantArray {
if let picture = dict["restaurantPicture"] as? String,
let name = dict["restaurantName"] as? String,
let status = dict["status"] as? String {

let restaurantModal: Restaurant = Restaurant( restaurantPicture: picture, restaurantName: name, status: status)
self.restaurant.append(restaurantModal)
}
}

// Reload table view on main thread (UI related update)
DispatchQueue.main.async {
self.tableViewRestaurants.reloadData()
}
}

0 dla odpowiedzi № 3

Możesz spróbować tego:

        var arrExtractedData:NSMutableArray = NSMutableArray()

if let jsonResponse = response.result.value as? [String: Any]{
let arrRestaurants = json["restaurants"] as? [[String: Any]]

for data in arrRestaurants {
let tempDic:NSMutableDictionary = NSMutableDictionary()

let id = dict["id"]
tempDic.setValue(id, forKey: "id")
let restaurantName = dict["restaurantName"]
tempDic.setValue(restaurantName, forKey: "restaurantName")
let restaurantPicture = dict["restaurantPicture"]
tempDic.setValue(restaurantPicture, forKey: "restaurantPicture")
let status = dict["status"]
tempDic.setValue(status, forKey: "status")
let workingDays = dict["workingDays"]
tempDic.setValue(workingDays, forKey: "workingDays")
let workingHours = dict["workingHours"]
tempDic.setValue(workingHours, forKey: "workingHours")
arrExtractedData.add(tempDic)
}
}

print(arrExtractedData) //Extracted Data

0 dla odpowiedzi nr 4

Powinieneś użyć protokołu Codable. To naprawdę ułatwia sprawę.

Spójrz, biorąc pod uwagę te dane

let data = """
{
"restaurants": [
{
"id": 1,
"restaurantName": "Chuks",
"restaurantPicture": "restaurantImages/benards.jpg",
"status": "Working",
"workingDays": "Tuesday to Sunday",
"workingHours": "3pm to 10pm"
},
{
"id": 3,
"restaurantName": "Chuks",
"restaurantPicture": "restaurantImages/benards.jpg",
"status": "Working",
"workingDays": "Tuesday to Sunday",
"workingHours": "3pm to 10pm"
},
{
"id": 4,
"restaurantName": "Chuks",
"restaurantPicture": "restaurantImages/benards.jpg",
"status": "Working",
"workingDays": "Tuesday to Sunday",
"workingHours": "3pm to 10pm"
},
{
"id": 5,
"restaurantName": "Chuks",
"restaurantPicture": "restaurantImages/benards.jpg",
"status": "Working",
"workingDays": "Tuesday to Sunday",
"workingHours": "3pm to 10pm"
},
{
"id": 6,
"restaurantName": "Chuks",
"restaurantPicture": "restaurantImages/benards.jpg",
"status": "Working",
"workingDays": "Tuesday to Sunday",
"workingHours": "3pm to 10pm"
}
]
}
""".data(using: .utf8)!

I ta struktura

struct Response: Codable {
let restaurants: [Restaurant]

struct Restaurant: Codable {
let id: Int
let restaurantName: String
let restaurantPicture: String
let status: String
let workingDays: String
let workingHours: String
}
}

Możesz łatwo uzyskać tablicę Restaurant(s).

let restaurants = try? JSONDecoder().decode(Response.self, from: data).restaurants