假设
首先,您发布的 json 示例不是有效的 json,而是您在调试器中看到的输出。我假设 json 将类似于以下格式:
{
"appointments": [
{
"numApts": 1,
"title": "Coffee",
"scheduleDate": "2015-11-02"
},
{
"numApts": 2,
"title": "Shower",
"scheduleDate": "2015-11-04"
},
{
"numApts": 3,
"title": "Rollercoaster!!!!",
"scheduleDate": "2015-12-24"
}
]
}
TL;DR
我建议您创建一个Appointment
代表单个约会的模型。然后,您应该创建一个包装器,用于存储所有约会,并根据工作日进行过滤。您可以为该包装器命名任何您认为适合您的项目的名称。
代码示例
我尝试为您想要实现的内容整理最简单的案例。希望代码中使用的命名具有足够的描述性以解释其本身。
我认为这对于回答您的问题并让您从这里开始有很大的帮助。我的代码的输出将类似于下图:
现在,我需要强调的是,在开始在生产中使用类似的东西之前,您需要注意这里和那里有一些力量展开。
Appointment.swift
:
//
// Appointment.swift
// WeekDays
//
// Created by Stefan Veis Pennerup on 02/11/15.
// Copyright © 2015 Kumuluzz. All rights reserved.
//
import Foundation
struct Appointment {
// MARK: - Formatter
private static var DateFormatter: NSDateFormatter = {
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
return formatter
}()
// MARK: - Properties
let numApts: Int
let title: String
let scheduleDate: NSDate
// MARK: - Initializers
init(json: [String: AnyObject]) {
numApts = json["numApts"] as? Int ?? 0
title = json["title"] as? String ?? ""
let dateString = json["scheduleDate"] as? String ?? ""
scheduleDate = Appointment.DateFormatter.dateFromString(dateString) ?? NSDate()
}
}
WeekDaysModel.swift
:
//
// WeekDays.swift
// WeekDays
//
// Created by Stefan Veis Pennerup on 02/11/15.
// Copyright © 2015 Kumuluzz. All rights reserved.
//
import Foundation
enum WeekDay: Int {
// Sunday has been set as the initial index, because the NSDateComponents
// has been created with Sunday as the initial day with an index of 1.
// This is being taken into consideration in the getWeekDayIndexForDate()
case Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
}
struct WeekDaysModel {
// MARK: - Properties
var appointments: [WeekDay: [Appointment]] = [
WeekDay.Monday:[],
WeekDay.Tuesday:[],
WeekDay.Wednesday:[],
WeekDay.Thursday:[],
WeekDay.Friday:[],
WeekDay.Saturday:[],
WeekDay.Sunday:[]
]
// MARK: - Initializers
init() {}
init(json: [String: AnyObject]) {
// Ensures there is data
guard let appointmentsJson = json["appointments"] as? [[String: AnyObject]] else {
return
}
// Parses the data points to the Appointment model
let apts = appointmentsJson.map { json in
return Appointment(json: json)
}
// Assigns each Appointment to a weekday
_ = apts.map { apt in
let i = getWeekDayIndexForDate(apt.scheduleDate)
appointments[WeekDay(rawValue: i)!]! += [apt]
}
}
// MARK: - Helpers
private func getWeekDayIndexForDate(aDate: NSDate) -> Int {
let cal = NSCalendar(identifier: NSCalendarIdentifierGregorian)!
let comp = cal.components(.Weekday, fromDate: aDate)
return (comp.weekday - 1)
}
}
ViewController.swift
:
//
// ViewController.swift
// WeekDays
//
// Created by Stefan Veis Pennerup on 02/11/15.
// Copyright © 2015 Kumuluzz. All rights reserved.
//
import UIKit
class ViewController: UITableViewController {
// MARK: - Properties
private var model = WeekDaysModel() {
didSet {
tableView.reloadData()
}
}
// MARK: - Lifecycle methods
override func viewDidLoad() {
super.viewDidLoad()
Backend.downloadAppointments{
self.model = $0
}
}
// MARK: - UITableViewDelegate
// MARK: - UITableViewDataSource
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return model.appointments.count
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return model.appointments[WeekDay(rawValue: section)!]!.count
}
override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return String(WeekDay(rawValue: section)!)
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("myCell")!
let apts = model.appointments[WeekDay(rawValue: indexPath.section)!]!
cell.textLabel?.text = apts[indexPath.row].title
return cell
}
}
Backend.swift
:
//
// Backend.swift
// WeekDays
//
// Created by Stefan Veis Pennerup on 02/11/15.
// Copyright © 2015 Kumuluzz. All rights reserved.
//
import Foundation
import Alamofire
struct Backend {
static func downloadAppointments(handler: (WeekDaysModel)->Void) {
let url = "http://stefanveispennerup.com/so.json"
Alamofire.request(.GET, url).responseJSON { response in
// TODO: Check response code, etc..
if let json = response.result.value as? [String: AnyObject] {
let model = WeekDaysModel(json: json)
handler(model)
}
}
}
}