Last active
October 30, 2023 10:42
-
-
Save Codelaby/061ae16f9a6b73a991651c7937cdf5dd to your computer and use it in GitHub Desktop.
Apple buy guide
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
extension Calendar { | |
func numberOfDaysBetween(_ from: Date, and to: Date) -> Int { | |
let fromDate = startOfDay(for: from) // <1> | |
let toDate = startOfDay(for: to) // <2> | |
let numberOfDays = dateComponents([.day], from: fromDate, to: toDate) // <3> | |
return numberOfDays.day! | |
} | |
} | |
let jsonSource = """ | |
[{"model":"AirPods Max","release_at":"2020-12-15","discontinued_at":"","id":127,"category":"AirPods","family":"AirPods Max","image":""},{"model":"Apple Watch Series 6","release_at":"2020-09-18","discontinued_at":"2021-09-14","id":97,"category":"Apple Watch","family":"Apple Watch","image":""},{"model":"Apple Watch SE (1st)","release_at":"2020-09-18","discontinued_at":"2022-09-07","id":96,"category":"Apple Watch","family":"Apple Watch SE","image":""},{"model":"AirPods Pro (1st generation)","release_at":"2019-10-30","discontinued_at":"2022-09-07","id":126,"category":"AirPods","family":"AirPods Pro","image":""},{"model":"AirPods Pro (2nd generation)","release_at":"2022-09-23","discontinued_at":"","id":129,"category":"AirPods","family":"AirPods Pro","image":""},{"model":"AirPods (1st generation)","release_at":"2016-12-13","discontinued_at":"2019-03-20","id":124,"category":"AirPods","family":"AirPods","image":""},{"model":"AirPods (2nd generation)","release_at":"2019-03-20","discontinued_at":"","id":125,"category":"AirPods","family":"AirPods","image":""},{"model":"AirPods (3rd generation)","release_at":"2021-10-26","discontinued_at":"","id":128,"category":"AirPods","family":"AirPods","image":""},{"model":"HomePod (1st generation)","release_at":"2018-02-09","discontinued_at":"2021-03-12","id":130,"category":"HomePod","family":"HomePod","image":""},{"model":"HomePod (2nd generation)","release_at":"2023-02-03","discontinued_at":"","id":131,"category":"HomePod","family":"HomePod","image":""},{"model":"HomePod Mini","release_at":"2020-11-16","discontinued_at":"","id":132,"category":"HomePod","family":"HomePod Mini","image":""},{"model":"iPad Pro (6th generation)","release_at":"2022-10-26","discontinued_at":"","id":28,"category":"iPad","family":"iPad Pro","image":""},{"model":"iPad (1st generation)","release_at":"2010-04-03","discontinued_at":"2011-03-02","id":1,"category":"iPad","family":"iPad","image":""},{"model":"iPad 2","release_at":"2011-03-11","discontinued_at":"2014-03-18","id":2,"category":"iPad","family":"iPad","image":""},{"model":"iPad (3rd generation)","release_at":"2012-03-16","discontinued_at":"2012-10-23","id":3,"category":"iPad","family":"iPad","image":""},{"model":"iPad (4th generation)","release_at":"2012-11-02","discontinued_at":"2014-10-16","id":5,"category":"iPad","family":"iPad","image":""},{"model":"iPad (5th generation)","release_at":"2017-03-24","discontinued_at":"2018-03-27","id":13,"category":"iPad","family":"iPad","image":""},{"model":"iPad (6th generation)","release_at":"2018-03-27","discontinued_at":"2019-09-10","id":16,"category":"iPad","family":"iPad","image":""},{"model":"iPad (7th generation)","release_at":"2019-09-25","discontinued_at":"2020-09-15","id":20,"category":"iPad","family":"iPad","image":""},{"model":"iPad (8th generation)","release_at":"2020-09-18","discontinued_at":"2021-09-14","id":22,"category":"iPad","family":"iPad","image":""},{"model":"iPad Pro (1st generation) 9.7-inch","release_at":"2016-03-31","discontinued_at":"2017-06-05","id":12,"category":"iPad","family":"iPad Pro","image":""},{"model":"iPad Pro (2nd generation) 12.9-inch","release_at":"2017-06-13","discontinued_at":"2018-10-30","id":14,"category":"iPad","family":"iPad Pro","image":""},{"model":"iPad Pro (2nd gen) 10.5-inch","release_at":"2017-06-13","discontinued_at":"2019-03-18","id":15,"category":"iPad","family":"iPad Pro","image":""},{"model":"iPad Pro (3rd generation)","release_at":"2018-11-07","discontinued_at":"2020-03-18","id":17,"category":"iPad","family":"iPad Pro","image":""},{"model":"iPad Pro (4th generation)","release_at":"2020-03-25","discontinued_at":"2021-04-20","id":21,"category":"iPad","family":"iPad Pro","image":""},{"model":"iPad Pro (5th generation)","release_at":"2021-05-21","discontinued_at":"2022-10-18","id":24,"category":"iPad","family":"iPad Pro","image":""},{"model":"iPhone","release_at":"2007-06-29","discontinued_at":"2008-06-09","id":30,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 3G","release_at":"2008-07-11","discontinued_at":"2010-08-09","id":31,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 3GS","release_at":"2009-06-19","discontinued_at":"2012-09-12","id":32,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 4","release_at":"2010-06-24","discontinued_at":"2013-09-10","id":33,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 4S","release_at":"2011-10-14","discontinued_at":"2014-09-09","id":34,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 5","release_at":"2012-09-21","discontinued_at":"2013-09-10","id":35,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 5C","release_at":"2013-09-20","discontinued_at":"2015-09-09","id":36,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 5S","release_at":"2013-09-20","discontinued_at":"2016-03-21","id":37,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 6","release_at":"2014-09-19","discontinued_at":"2016-09-07","id":38,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 6S","release_at":"2015-09-25","discontinued_at":"2018-09-12","id":40,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone SE (1st)","release_at":"2016-03-31","discontinued_at":"2018-09-12","id":42,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 7","release_at":"2016-09-16","discontinued_at":"2019-09-10","id":43,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 8","release_at":"2017-09-22","discontinued_at":"2020-04-15","id":45,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone XR","release_at":"2018-10-26","discontinued_at":"2021-09-14","id":48,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone XS","release_at":"2018-09-21","discontinued_at":"2019-09-10","id":49,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone XS Max","release_at":"2018-09-21","discontinued_at":"2019-09-10","id":50,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 11","release_at":"2019-09-20","discontinued_at":"2022-09-07","id":51,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone SE (2nd)","release_at":"2020-04-24","discontinued_at":"2022-03-08","id":54,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 12","release_at":"2020-10-23","discontinued_at":"2023-09-12","id":55,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 12 Mini","release_at":"2020-11-13","discontinued_at":"2022-09-07","id":56,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 13","release_at":"2021-09-24","discontinued_at":"2023-09-12","id":59,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 13 Mini","release_at":"2021-09-24","discontinued_at":"2023-09-12","id":60,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 14","release_at":"2022-09-16","discontinued_at":"","id":64,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 14 Plus","release_at":"2022-10-07","discontinued_at":"","id":65,"category":"iPhone","family":"iPhone Plus","image":""},{"model":"iPhone 15 Pro","release_at":"2023-09-22","discontinued_at":"","id":70,"category":"iPhone","family":"iPhone Pro","image":""},{"model":"iPad (9th generation)","release_at":"2021-09-24","discontinued_at":"","id":25,"category":"iPad","family":"iPad","image":""},{"model":"iPad Mini (1st generation)","release_at":"2012-11-02","discontinued_at":"2015-06-19","id":4,"category":"iPad","family":"iPad Mini","image":""},{"model":"iPad Mini 2","release_at":"2013-11-12","discontinued_at":"2017-03-21","id":7,"category":"iPad","family":"iPad Mini","image":""},{"model":"iPad Mini 3","release_at":"2014-10-22","discontinued_at":"2015-09-09","id":8,"category":"iPad","family":"iPad Mini","image":""},{"model":"iPad Mini 4","release_at":"2015-09-09","discontinued_at":"2019-03-18","id":10,"category":"iPad","family":"iPad Mini","image":""},{"model":"iPad Mini (5th generation)","release_at":"2019-03-18","discontinued_at":"2021-09-14","id":18,"category":"iPad","family":"iPad Mini","image":""},{"model":"iPad Air (1st generation)","release_at":"2013-11-01","discontinued_at":"2016-03-21","id":6,"category":"iPad","family":"iPad Air","image":""},{"model":"iPad Air 2","release_at":"2014-10-22","discontinued_at":"2017-03-21","id":9,"category":"iPad","family":"iPad Air","image":""},{"model":"iPad Air (3rd generation)","release_at":"2019-03-18","discontinued_at":"2020-09-15","id":19,"category":"iPad","family":"iPad Air","image":""},{"model":"iPad Air (4th generation)","release_at":"2020-10-23","discontinued_at":"2022-03-08","id":23,"category":"iPad","family":"iPad Air","image":""},{"model":"iPad Pro (1st generation) 12.9-inch","release_at":"2015-11-11","discontinued_at":"2017-06-05","id":11,"category":"iPad","family":"iPad Pro","image":""},{"model":"iPhone 6 Plus","release_at":"2014-09-19","discontinued_at":"2016-09-07","id":39,"category":"iPhone","family":"iPhone Plus","image":""},{"model":"iPhone 6S Plus","release_at":"2015-09-25","discontinued_at":"2018-09-12","id":41,"category":"iPhone","family":"iPhone Plus","image":""},{"model":"iPhone 7 Plus","release_at":"2016-09-16","discontinued_at":"2019-09-10","id":44,"category":"iPhone","family":"iPhone Plus","image":""},{"model":"iPhone 8 Plus","release_at":"2017-09-22","discontinued_at":"2020-04-15","id":46,"category":"iPhone","family":"iPhone Plus","image":""},{"model":"iPhone 14 Pro","release_at":"2022-09-16","discontinued_at":"2023-09-12","id":66,"category":"iPhone","family":"iPhone Pro","image":""},{"model":"iPhone 11 Pro","release_at":"2019-09-20","discontinued_at":"2020-10-13","id":52,"category":"iPhone","family":"iPhone Pro","image":""},{"model":"iPhone 13 Pro","release_at":"2021-09-24","discontinued_at":"2022-09-07","id":61,"category":"iPhone","family":"iPhone Pro","image":""},{"model":"iPhone 14 Pro Max","release_at":"2022-09-16","discontinued_at":"2023-09-12","id":67,"category":"iPhone","family":"iPhone Pro Max","image":""},{"model":"iPhone 11 Pro Max","release_at":"2019-09-20","discontinued_at":"2020-10-13","id":53,"category":"iPhone","family":"iPhone Pro Max","image":""},{"model":"iPhone 12 Pro Max","release_at":"2020-11-13","discontinued_at":"2021-09-14","id":58,"category":"iPhone","family":"iPhone Pro Max","image":""},{"model":"iPhone 13 Pro Max","release_at":"2021-09-24","discontinued_at":"2022-09-07","id":62,"category":"iPhone","family":"iPhone Pro Max","image":""},{"model":"iPhone 12 Pro","release_at":"2020-10-23","discontinued_at":"2021-09-14","id":57,"category":"iPhone","family":"iPhone Pro","image":""},{"model":"iPhone X","release_at":"2017-11-03","discontinued_at":"2018-09-12","id":47,"category":"iPhone","family":"iPhone Pro","image":""},{"model":"iPhone 15","release_at":"2023-09-22","discontinued_at":"","id":68,"category":"iPhone","family":"iPhone","image":"https://store.storeimages.cdn-apple.com/4668/as-images.apple.com/is/iphone-15-finish-select-202309-6-1inch-black?wid=2560&hei=1440&fmt=p-jpg&qlt=80&.v=1692923777911"},{"model":"iPhone 15 Pro Max","release_at":"2023-09-22","discontinued_at":"","id":71,"category":"iPhone","family":"iPhone Pro Max","image":"https://store.storeimages.cdn-apple.com/4668/as-images.apple.com/is/iphone-15-pro-finish-select-202309-6-7inch-naturaltitanium?wid=2560&hei=1440&fmt=p-jpg&qlt=80&.v=1692845702708"},{"model":"iPhone 15 Plus","release_at":"2023-09-22","discontinued_at":"","id":69,"category":"iPhone","family":"iPhone Plus","image":"https://store.storeimages.cdn-apple.com/4668/as-images.apple.com/is/iphone-15-finish-select-202309-6-7inch-pink?wid=2560&hei=1440&fmt=p-jpg&qlt=80&.v=1692923784895"},{"model":"iPad (10th generation)","release_at":"2022-10-26","discontinued_at":"","id":29,"category":"iPad","family":"iPad","image":"https://store.storeimages.cdn-apple.com/4668/as-images.apple.com/is/ipad-10th-gen-finish-select-202212-blue-wifi?wid=2560&hei=1440&fmt=p-jpg&qlt=95&.v=1670856033679"},{"model":"iPhone SE (3rd)","release_at":"2022-03-18","discontinued_at":"","id":63,"category":"iPhone","family":"iPhone","image":"https://store.storeimages.cdn-apple.com/4668/as-images.apple.com/is/iphone-se-finish-select-202207-starlight?wid=2560&hei=1440&fmt=p-jpg&qlt=80&.v=1655316263356"},{"model":"iPad Air (5th generation)","release_at":"2022-03-18","discontinued_at":"","id":27,"category":"iPad","family":"iPad Air","image":"https://store.storeimages.cdn-apple.com/4668/as-images.apple.com/is/ipad-air-finish-select-gallery-202211-purple-wifi?wid=2560&hei=1440&fmt=p-jpg&qlt=95&.v=1670631590784"},{"model":"iPad Mini (6th generation)","release_at":"2021-09-24","discontinued_at":"","id":26,"category":"iPad","family":"iPad Mini","image":"https://store.storeimages.cdn-apple.com/4668/as-images.apple.com/is/ipad-mini-finish-select-gallery-202211-purple-wifi?wid=2560&hei=1440&fmt=p-jpg&qlt=95&.v=1670950641171"},{"model":"Apple Watch","release_at":"2015-04-24","discontinued_at":"2016-09-07","id":90,"category":"Apple Watch","family":"Apple Watch","image":""},{"model":"Apple Watch Series 1","release_at":"2016-09-12","discontinued_at":"2018-09-12","id":91,"category":"Apple Watch","family":"Apple Watch","image":""},{"model":"Apple Watch Series 2","release_at":"2016-09-16","discontinued_at":"2017-09-12","id":92,"category":"Apple Watch","family":"Apple Watch","image":""},{"model":"Apple Watch Series 3","release_at":"2017-09-22","discontinued_at":"2022-09-07","id":93,"category":"Apple Watch","family":"Apple Watch","image":""},{"model":"Apple Watch Series 4","release_at":"2018-09-21","discontinued_at":"2019-09-10","id":94,"category":"Apple Watch","family":"Apple Watch","image":""},{"model":"Apple Watch Series 5","release_at":"2019-09-20","discontinued_at":"2020-09-15","id":95,"category":"Apple Watch","family":"Apple Watch","image":""},{"model":"Apple Watch Series 7","release_at":"2021-10-15","discontinued_at":"2022-09-07","id":98,"category":"Apple Watch","family":"Apple Watch","image":""},{"model":"Apple Watch Series 8","release_at":"2022-09-16","discontinued_at":"2023-09-12","id":100,"category":"Apple Watch","family":"Apple Watch","image":""},{"model":"Apple Watch Series 9","release_at":"2023-09-22","discontinued_at":"","id":102,"category":"Apple Watch","family":"Apple Watch","image":""},{"model":"Apple Watch SE (2nd)","release_at":"2022-09-16","discontinued_at":"","id":99,"category":"Apple Watch","family":"Apple Watch SE","image":""},{"model":"Apple Watch Ultra","release_at":"2022-09-23","discontinued_at":"2023-09-12","id":101,"category":"Apple Watch","family":"Apple Watch Ultra","image":""},{"model":"Apple Watch Ultra 2","release_at":"2023-09-22","discontinued_at":"","id":103,"category":"Apple Watch","family":"Apple Watch Ultra","image":""},{"model":"Apple TV (2nd generation)","release_at":"2010-09-01","discontinued_at":"2012-03-07","id":110,"category":"Apple TV","family":"Apple TV","image":""},{"model":"Apple TV (3rd generation)","release_at":"2012-03-07","discontinued_at":"2013-03-10","id":111,"category":"Apple TV","family":"Apple TV","image":""},{"model":"Apple TV (3rd generation rev A)","release_at":"2013-01-28","discontinued_at":"2016-09-08","id":112,"category":"Apple TV","family":"Apple TV","image":""},{"model":"Apple TV (2nd generation)","release_at":"2010-09-01","discontinued_at":"2012-03-07","id":117,"category":"Apple TV","family":"Apple TV","image":""},{"model":"Apple TV (3rd generation)","release_at":"2012-03-07","discontinued_at":"2013-03-10","id":118,"category":"Apple TV","family":"Apple TV","image":""},{"model":"Apple TV (3rd generation rev A)","release_at":"2013-01-28","discontinued_at":"2016-09-08","id":119,"category":"Apple TV","family":"Apple TV","image":""},{"model":"Apple TV HD","release_at":"2015-10-30","discontinued_at":"2022-10-18","id":113,"category":"Apple TV","family":"Apple TV HD","image":""},{"model":"Apple TV HD","release_at":"2015-10-30","discontinued_at":"2022-10-18","id":120,"category":"Apple TV","family":"Apple TV HD","image":""},{"model":"Apple TV 4K (1st generation)","release_at":"2017-09-22","discontinued_at":"2021-04-21","id":114,"category":"Apple TV","family":"Apple TV 4K","image":""},{"model":"Apple TV 4K (2nd generation)","release_at":"2021-05-21","discontinued_at":"2022-10-18","id":115,"category":"Apple TV","family":"Apple TV 4K","image":""},{"model":"Apple TV 4K (3rd generation)","release_at":"2022-11-04","discontinued_at":"","id":116,"category":"Apple TV","family":"Apple TV 4K","image":""},{"model":"Apple TV 4K (1st generation)","release_at":"2017-09-22","discontinued_at":"2021-04-21","id":121,"category":"Apple TV","family":"Apple TV 4K","image":""},{"model":"Apple TV 4K (2nd generation)","release_at":"2021-05-21","discontinued_at":"2022-10-18","id":122,"category":"Apple TV","family":"Apple TV 4K","image":""},{"model":"Apple TV 4K (3rd generation)","release_at":"2022-11-04","discontinued_at":"","id":123,"category":"Apple TV","family":"Apple TV 4K","image":""}] | |
""" | |
struct AppleProduct { | |
let model: String | |
let releaseDate: String | |
let discontinuedDate: String | |
let id: Int | |
let category: String | |
let family: String | |
let image: String | |
} | |
func parseJSONToAppleProducts(jsonSource: String) -> [AppleProduct] { | |
if let data = jsonSource.data(using: .utf8) { | |
do { | |
if let jsonArray = try JSONSerialization.jsonObject(with: data, options: []) as? [[String: Any]] { | |
var appleProducts: [AppleProduct] = [] | |
for item in jsonArray { | |
if let model = item["model"] as? String, | |
let releaseDate = item["release_at"] as? String, | |
let discontinuedDate = item["discontinued_at"] as? String, | |
let id = item["id"] as? Int, | |
let category = item["category"] as? String, | |
let family = item["family"] as? String, | |
let image = item["image"] as? String { | |
let product = AppleProduct(model: model, releaseDate: releaseDate, discontinuedDate: discontinuedDate, id: id, category: category, family: family, image: image) | |
appleProducts.append(product) | |
} | |
} | |
return appleProducts | |
} | |
} catch { | |
print("Error al parsear el JSON: \(error)") | |
} | |
} | |
return [] | |
} | |
func uniqueCategoriesFromAppleProducts(_ products: [AppleProduct]) -> [String] { | |
let categories = Set(products.map { $0.category }) | |
return Array(categories) | |
} | |
func uniqueFamiliesFromAppleProducts(_ products: [AppleProduct]) -> [String] { | |
let families = Set(products.map { $0.family }) | |
return Array(families) | |
} | |
func filterAndSortProducts(_ products: [AppleProduct]) -> [AppleProduct] { | |
let filteredProducts = products.filter { $0.discontinuedDate.isEmpty } | |
let sortedProducts = filteredProducts.sorted { (product1, product2) in | |
if product1.releaseDate != product2.releaseDate { | |
return product1.releaseDate > product2.releaseDate | |
} else if product1.category != product2.category { | |
return product1.category < product2.category | |
} else { | |
return product1.family < product2.family | |
} | |
} | |
return sortedProducts | |
} | |
func filterAndSortProductsFirst(_ products: [AppleProduct]) -> [AppleProduct] { | |
let filteredProducts = products.filter { $0.discontinuedDate.isEmpty } | |
// Sort the filtered products by release date in descending order | |
let sortedProducts = filteredProducts.sorted { $0.releaseDate > $1.releaseDate } | |
var firstProductOfEachFamily: [AppleProduct] = [] | |
var seenFamilies: Set<String> = Set() | |
for product in sortedProducts { | |
if !seenFamilies.contains(product.family) { | |
seenFamilies.insert(product.family) | |
firstProductOfEachFamily.append(product) | |
} | |
} | |
return firstProductOfEachFamily | |
} | |
func productsOfFamily(_ family: String, from products: [AppleProduct]) -> [AppleProduct] { | |
let filteredProducts = products.filter { $0.family == family } | |
let sortedProducts = filteredProducts.sorted { $0.releaseDate > $1.releaseDate } | |
return sortedProducts | |
} | |
extension AppleProduct { | |
func daysSinceReleaseDate() -> Int { | |
let dateFormatter = DateFormatter() | |
dateFormatter.dateFormat = "yyyy-MM-dd" | |
guard let release = dateFormatter.date(from: releaseDate) else { | |
return 0 | |
} | |
let calendar = Calendar.current | |
let currentDate = Date() | |
return calendar.numberOfDaysBetween(release, and: currentDate) | |
} | |
} | |
let appleProducts = parseJSONToAppleProducts(jsonSource: jsonSource) | |
print(appleProducts.count) | |
let uniqueCategories = uniqueCategoriesFromAppleProducts(appleProducts) | |
let uniqueFamilies = uniqueFamiliesFromAppleProducts(appleProducts) | |
let filteredAndSortedProducts = filterAndSortProductsFirst(appleProducts) | |
//print(uniqueCategories) | |
//print(uniqueFamilies) | |
let desiredFamily = "iPhone" // Familia deseada (puedes cambiarla a la que desees) | |
let productsOfDesiredFamily = productsOfFamily(desiredFamily, from: appleProducts) | |
var lastReleasedDate = Date() | |
let calendar = Calendar.current | |
for product in productsOfDesiredFamily { | |
let daysSinceRelease = product.daysSinceReleaseDate() | |
let avSupportDays = calendar.numberOfDaysBetween(product.releaseDate, and: lastReleasedDate) | |
//print("Model: \(product.model), Family: \(product.family)") | |
print("Model: \(product.model), Days Since Release: \(daysSinceRelease)") | |
print(": \(avSupportDays), Days support") | |
lastReleasedDate = product.releaseDate | |
} | |
/* | |
for product in filteredAndSortedProducts { | |
let daysSinceRelease = product.daysSinceReleaseDate() | |
print("Model: \(product.model), Days Since Release: \(daysSinceRelease)") | |
print("Release Date: \(product.releaseDate)") | |
print("Discontinued Date: \(product.discontinuedDate)") | |
print("ID: \(product.id)") | |
print("Category: \(product.category)") | |
print("Family: \(product.family)") | |
print("Image: \(product.image)") | |
print("---------\n") // Para separar cada producto en la salida | |
} | |
*/ | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
let jsonSource = """ | |
[{"model":"AirPods Max","release_at":"2020-12-15","discontinued_at":"","id":127,"category":"AirPods","family":"AirPods Max","image":""},{"model":"Apple Watch Series 6","release_at":"2020-09-18","discontinued_at":"2021-09-14","id":97,"category":"Apple Watch","family":"Apple Watch","image":""},{"model":"Apple Watch SE (1st)","release_at":"2020-09-18","discontinued_at":"2022-09-07","id":96,"category":"Apple Watch","family":"Apple Watch SE","image":""},{"model":"AirPods Pro (1st generation)","release_at":"2019-10-30","discontinued_at":"2022-09-07","id":126,"category":"AirPods","family":"AirPods Pro","image":""},{"model":"AirPods Pro (2nd generation)","release_at":"2022-09-23","discontinued_at":"","id":129,"category":"AirPods","family":"AirPods Pro","image":""},{"model":"AirPods (1st generation)","release_at":"2016-12-13","discontinued_at":"2019-03-20","id":124,"category":"AirPods","family":"AirPods","image":""},{"model":"AirPods (2nd generation)","release_at":"2019-03-20","discontinued_at":"","id":125,"category":"AirPods","family":"AirPods","image":""},{"model":"AirPods (3rd generation)","release_at":"2021-10-26","discontinued_at":"","id":128,"category":"AirPods","family":"AirPods","image":""},{"model":"HomePod (1st generation)","release_at":"2018-02-09","discontinued_at":"2021-03-12","id":130,"category":"HomePod","family":"HomePod","image":""},{"model":"HomePod (2nd generation)","release_at":"2023-02-03","discontinued_at":"","id":131,"category":"HomePod","family":"HomePod","image":""},{"model":"HomePod Mini","release_at":"2020-11-16","discontinued_at":"","id":132,"category":"HomePod","family":"HomePod Mini","image":""},{"model":"iPad Pro (6th generation)","release_at":"2022-10-26","discontinued_at":"","id":28,"category":"iPad","family":"iPad Pro","image":""},{"model":"iPad (1st generation)","release_at":"2010-04-03","discontinued_at":"2011-03-02","id":1,"category":"iPad","family":"iPad","image":""},{"model":"iPad 2","release_at":"2011-03-11","discontinued_at":"2014-03-18","id":2,"category":"iPad","family":"iPad","image":""},{"model":"iPad (3rd generation)","release_at":"2012-03-16","discontinued_at":"2012-10-23","id":3,"category":"iPad","family":"iPad","image":""},{"model":"iPad (4th generation)","release_at":"2012-11-02","discontinued_at":"2014-10-16","id":5,"category":"iPad","family":"iPad","image":""},{"model":"iPad (5th generation)","release_at":"2017-03-24","discontinued_at":"2018-03-27","id":13,"category":"iPad","family":"iPad","image":""},{"model":"iPad (6th generation)","release_at":"2018-03-27","discontinued_at":"2019-09-10","id":16,"category":"iPad","family":"iPad","image":""},{"model":"iPad (7th generation)","release_at":"2019-09-25","discontinued_at":"2020-09-15","id":20,"category":"iPad","family":"iPad","image":""},{"model":"iPad (8th generation)","release_at":"2020-09-18","discontinued_at":"2021-09-14","id":22,"category":"iPad","family":"iPad","image":""},{"model":"iPad Pro (1st generation) 9.7-inch","release_at":"2016-03-31","discontinued_at":"2017-06-05","id":12,"category":"iPad","family":"iPad Pro","image":""},{"model":"iPad Pro (2nd generation) 12.9-inch","release_at":"2017-06-13","discontinued_at":"2018-10-30","id":14,"category":"iPad","family":"iPad Pro","image":""},{"model":"iPad Pro (2nd gen) 10.5-inch","release_at":"2017-06-13","discontinued_at":"2019-03-18","id":15,"category":"iPad","family":"iPad Pro","image":""},{"model":"iPad Pro (3rd generation)","release_at":"2018-11-07","discontinued_at":"2020-03-18","id":17,"category":"iPad","family":"iPad Pro","image":""},{"model":"iPad Pro (4th generation)","release_at":"2020-03-25","discontinued_at":"2021-04-20","id":21,"category":"iPad","family":"iPad Pro","image":""},{"model":"iPad Pro (5th generation)","release_at":"2021-05-21","discontinued_at":"2022-10-18","id":24,"category":"iPad","family":"iPad Pro","image":""},{"model":"iPhone","release_at":"2007-06-29","discontinued_at":"2008-06-09","id":30,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 3G","release_at":"2008-07-11","discontinued_at":"2010-08-09","id":31,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 3GS","release_at":"2009-06-19","discontinued_at":"2012-09-12","id":32,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 4","release_at":"2010-06-24","discontinued_at":"2013-09-10","id":33,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 4S","release_at":"2011-10-14","discontinued_at":"2014-09-09","id":34,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 5","release_at":"2012-09-21","discontinued_at":"2013-09-10","id":35,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 5C","release_at":"2013-09-20","discontinued_at":"2015-09-09","id":36,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 5S","release_at":"2013-09-20","discontinued_at":"2016-03-21","id":37,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 6","release_at":"2014-09-19","discontinued_at":"2016-09-07","id":38,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 6S","release_at":"2015-09-25","discontinued_at":"2018-09-12","id":40,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone SE (1st)","release_at":"2016-03-31","discontinued_at":"2018-09-12","id":42,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 7","release_at":"2016-09-16","discontinued_at":"2019-09-10","id":43,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 8","release_at":"2017-09-22","discontinued_at":"2020-04-15","id":45,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone XR","release_at":"2018-10-26","discontinued_at":"2021-09-14","id":48,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone XS","release_at":"2018-09-21","discontinued_at":"2019-09-10","id":49,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone XS Max","release_at":"2018-09-21","discontinued_at":"2019-09-10","id":50,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 11","release_at":"2019-09-20","discontinued_at":"2022-09-07","id":51,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone SE (2nd)","release_at":"2020-04-24","discontinued_at":"2022-03-08","id":54,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 12","release_at":"2020-10-23","discontinued_at":"2023-09-12","id":55,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 12 Mini","release_at":"2020-11-13","discontinued_at":"2022-09-07","id":56,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 13","release_at":"2021-09-24","discontinued_at":"2023-09-12","id":59,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 13 Mini","release_at":"2021-09-24","discontinued_at":"2023-09-12","id":60,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 14","release_at":"2022-09-16","discontinued_at":"","id":64,"category":"iPhone","family":"iPhone","image":""},{"model":"iPhone 14 Plus","release_at":"2022-10-07","discontinued_at":"","id":65,"category":"iPhone","family":"iPhone Plus","image":""},{"model":"iPhone 15 Pro","release_at":"2023-09-22","discontinued_at":"","id":70,"category":"iPhone","family":"iPhone Pro","image":""},{"model":"iPad (9th generation)","release_at":"2021-09-24","discontinued_at":"","id":25,"category":"iPad","family":"iPad","image":""},{"model":"iPad Mini (1st generation)","release_at":"2012-11-02","discontinued_at":"2015-06-19","id":4,"category":"iPad","family":"iPad Mini","image":""},{"model":"iPad Mini 2","release_at":"2013-11-12","discontinued_at":"2017-03-21","id":7,"category":"iPad","family":"iPad Mini","image":""},{"model":"iPad Mini 3","release_at":"2014-10-22","discontinued_at":"2015-09-09","id":8,"category":"iPad","family":"iPad Mini","image":""},{"model":"iPad Mini 4","release_at":"2015-09-09","discontinued_at":"2019-03-18","id":10,"category":"iPad","family":"iPad Mini","image":""},{"model":"iPad Mini (5th generation)","release_at":"2019-03-18","discontinued_at":"2021-09-14","id":18,"category":"iPad","family":"iPad Mini","image":""},{"model":"iPad Air (1st generation)","release_at":"2013-11-01","discontinued_at":"2016-03-21","id":6,"category":"iPad","family":"iPad Air","image":""},{"model":"iPad Air 2","release_at":"2014-10-22","discontinued_at":"2017-03-21","id":9,"category":"iPad","family":"iPad Air","image":""},{"model":"iPad Air (3rd generation)","release_at":"2019-03-18","discontinued_at":"2020-09-15","id":19,"category":"iPad","family":"iPad Air","image":""},{"model":"iPad Air (4th generation)","release_at":"2020-10-23","discontinued_at":"2022-03-08","id":23,"category":"iPad","family":"iPad Air","image":""},{"model":"iPad Pro (1st generation) 12.9-inch","release_at":"2015-11-11","discontinued_at":"2017-06-05","id":11,"category":"iPad","family":"iPad Pro","image":""},{"model":"iPhone 6 Plus","release_at":"2014-09-19","discontinued_at":"2016-09-07","id":39,"category":"iPhone","family":"iPhone Plus","image":""},{"model":"iPhone 6S Plus","release_at":"2015-09-25","discontinued_at":"2018-09-12","id":41,"category":"iPhone","family":"iPhone Plus","image":""},{"model":"iPhone 7 Plus","release_at":"2016-09-16","discontinued_at":"2019-09-10","id":44,"category":"iPhone","family":"iPhone Plus","image":""},{"model":"iPhone 8 Plus","release_at":"2017-09-22","discontinued_at":"2020-04-15","id":46,"category":"iPhone","family":"iPhone Plus","image":""},{"model":"iPhone 14 Pro","release_at":"2022-09-16","discontinued_at":"2023-09-12","id":66,"category":"iPhone","family":"iPhone Pro","image":""},{"model":"iPhone 11 Pro","release_at":"2019-09-20","discontinued_at":"2020-10-13","id":52,"category":"iPhone","family":"iPhone Pro","image":""},{"model":"iPhone 13 Pro","release_at":"2021-09-24","discontinued_at":"2022-09-07","id":61,"category":"iPhone","family":"iPhone Pro","image":""},{"model":"iPhone 14 Pro Max","release_at":"2022-09-16","discontinued_at":"2023-09-12","id":67,"category":"iPhone","family":"iPhone Pro Max","image":""},{"model":"iPhone 11 Pro Max","release_at":"2019-09-20","discontinued_at":"2020-10-13","id":53,"category":"iPhone","family":"iPhone Pro Max","image":""},{"model":"iPhone 12 Pro Max","release_at":"2020-11-13","discontinued_at":"2021-09-14","id":58,"category":"iPhone","family":"iPhone Pro Max","image":""},{"model":"iPhone 13 Pro Max","release_at":"2021-09-24","discontinued_at":"2022-09-07","id":62,"category":"iPhone","family":"iPhone Pro Max","image":""},{"model":"iPhone 12 Pro","release_at":"2020-10-23","discontinued_at":"2021-09-14","id":57,"category":"iPhone","family":"iPhone Pro","image":""},{"model":"iPhone X","release_at":"2017-11-03","discontinued_at":"2018-09-12","id":47,"category":"iPhone","family":"iPhone Pro","image":""},{"model":"iPhone 15","release_at":"2023-09-22","discontinued_at":"","id":68,"category":"iPhone","family":"iPhone","image":"https://store.storeimages.cdn-apple.com/4668/as-images.apple.com/is/iphone-15-finish-select-202309-6-1inch-black?wid=2560&hei=1440&fmt=p-jpg&qlt=80&.v=1692923777911"},{"model":"iPhone 15 Pro Max","release_at":"2023-09-22","discontinued_at":"","id":71,"category":"iPhone","family":"iPhone Pro Max","image":"https://store.storeimages.cdn-apple.com/4668/as-images.apple.com/is/iphone-15-pro-finish-select-202309-6-7inch-naturaltitanium?wid=2560&hei=1440&fmt=p-jpg&qlt=80&.v=1692845702708"},{"model":"iPhone 15 Plus","release_at":"2023-09-22","discontinued_at":"","id":69,"category":"iPhone","family":"iPhone Plus","image":"https://store.storeimages.cdn-apple.com/4668/as-images.apple.com/is/iphone-15-finish-select-202309-6-7inch-pink?wid=2560&hei=1440&fmt=p-jpg&qlt=80&.v=1692923784895"},{"model":"iPad (10th generation)","release_at":"2022-10-26","discontinued_at":"","id":29,"category":"iPad","family":"iPad","image":"https://store.storeimages.cdn-apple.com/4668/as-images.apple.com/is/ipad-10th-gen-finish-select-202212-blue-wifi?wid=2560&hei=1440&fmt=p-jpg&qlt=95&.v=1670856033679"},{"model":"iPhone SE (3rd)","release_at":"2022-03-18","discontinued_at":"","id":63,"category":"iPhone","family":"iPhone","image":"https://store.storeimages.cdn-apple.com/4668/as-images.apple.com/is/iphone-se-finish-select-202207-starlight?wid=2560&hei=1440&fmt=p-jpg&qlt=80&.v=1655316263356"},{"model":"iPad Air (5th generation)","release_at":"2022-03-18","discontinued_at":"","id":27,"category":"iPad","family":"iPad Air","image":"https://store.storeimages.cdn-apple.com/4668/as-images.apple.com/is/ipad-air-finish-select-gallery-202211-purple-wifi?wid=2560&hei=1440&fmt=p-jpg&qlt=95&.v=1670631590784"},{"model":"iPad Mini (6th generation)","release_at":"2021-09-24","discontinued_at":"","id":26,"category":"iPad","family":"iPad Mini","image":"https://store.storeimages.cdn-apple.com/4668/as-images.apple.com/is/ipad-mini-finish-select-gallery-202211-purple-wifi?wid=2560&hei=1440&fmt=p-jpg&qlt=95&.v=1670950641171"},{"model":"Apple Watch","release_at":"2015-04-24","discontinued_at":"2016-09-07","id":90,"category":"Apple Watch","family":"Apple Watch","image":""},{"model":"Apple Watch Series 1","release_at":"2016-09-12","discontinued_at":"2018-09-12","id":91,"category":"Apple Watch","family":"Apple Watch","image":""},{"model":"Apple Watch Series 2","release_at":"2016-09-16","discontinued_at":"2017-09-12","id":92,"category":"Apple Watch","family":"Apple Watch","image":""},{"model":"Apple Watch Series 3","release_at":"2017-09-22","discontinued_at":"2022-09-07","id":93,"category":"Apple Watch","family":"Apple Watch","image":""},{"model":"Apple Watch Series 4","release_at":"2018-09-21","discontinued_at":"2019-09-10","id":94,"category":"Apple Watch","family":"Apple Watch","image":""},{"model":"Apple Watch Series 5","release_at":"2019-09-20","discontinued_at":"2020-09-15","id":95,"category":"Apple Watch","family":"Apple Watch","image":""},{"model":"Apple Watch Series 7","release_at":"2021-10-15","discontinued_at":"2022-09-07","id":98,"category":"Apple Watch","family":"Apple Watch","image":""},{"model":"Apple Watch Series 8","release_at":"2022-09-16","discontinued_at":"2023-09-12","id":100,"category":"Apple Watch","family":"Apple Watch","image":""},{"model":"Apple Watch Series 9","release_at":"2023-09-22","discontinued_at":"","id":102,"category":"Apple Watch","family":"Apple Watch","image":""},{"model":"Apple Watch SE (2nd)","release_at":"2022-09-16","discontinued_at":"","id":99,"category":"Apple Watch","family":"Apple Watch SE","image":""},{"model":"Apple Watch Ultra","release_at":"2022-09-23","discontinued_at":"2023-09-12","id":101,"category":"Apple Watch","family":"Apple Watch Ultra","image":""},{"model":"Apple Watch Ultra 2","release_at":"2023-09-22","discontinued_at":"","id":103,"category":"Apple Watch","family":"Apple Watch Ultra","image":""},{"model":"Apple TV (2nd generation)","release_at":"2010-09-01","discontinued_at":"2012-03-07","id":110,"category":"Apple TV","family":"Apple TV","image":""},{"model":"Apple TV (3rd generation)","release_at":"2012-03-07","discontinued_at":"2013-03-10","id":111,"category":"Apple TV","family":"Apple TV","image":""},{"model":"Apple TV (3rd generation rev A)","release_at":"2013-01-28","discontinued_at":"2016-09-08","id":112,"category":"Apple TV","family":"Apple TV","image":""},{"model":"Apple TV (2nd generation)","release_at":"2010-09-01","discontinued_at":"2012-03-07","id":117,"category":"Apple TV","family":"Apple TV","image":""},{"model":"Apple TV (3rd generation)","release_at":"2012-03-07","discontinued_at":"2013-03-10","id":118,"category":"Apple TV","family":"Apple TV","image":""},{"model":"Apple TV (3rd generation rev A)","release_at":"2013-01-28","discontinued_at":"2016-09-08","id":119,"category":"Apple TV","family":"Apple TV","image":""},{"model":"Apple TV HD","release_at":"2015-10-30","discontinued_at":"2022-10-18","id":113,"category":"Apple TV","family":"Apple TV HD","image":""},{"model":"Apple TV HD","release_at":"2015-10-30","discontinued_at":"2022-10-18","id":120,"category":"Apple TV","family":"Apple TV HD","image":""},{"model":"Apple TV 4K (1st generation)","release_at":"2017-09-22","discontinued_at":"2021-04-21","id":114,"category":"Apple TV","family":"Apple TV 4K","image":""},{"model":"Apple TV 4K (2nd generation)","release_at":"2021-05-21","discontinued_at":"2022-10-18","id":115,"category":"Apple TV","family":"Apple TV 4K","image":""},{"model":"Apple TV 4K (3rd generation)","release_at":"2022-11-04","discontinued_at":"","id":116,"category":"Apple TV","family":"Apple TV 4K","image":""},{"model":"Apple TV 4K (1st generation)","release_at":"2017-09-22","discontinued_at":"2021-04-21","id":121,"category":"Apple TV","family":"Apple TV 4K","image":""},{"model":"Apple TV 4K (2nd generation)","release_at":"2021-05-21","discontinued_at":"2022-10-18","id":122,"category":"Apple TV","family":"Apple TV 4K","image":""},{"model":"Apple TV 4K (3rd generation)","release_at":"2022-11-04","discontinued_at":"","id":123,"category":"Apple TV","family":"Apple TV 4K","image":""}] | |
""" | |
struct AppleProduct { | |
let model: String | |
let releaseDate: String | |
let discontinuedDate: String | |
let id: Int | |
let category: String | |
let family: String | |
let image: String | |
} | |
func parseJSONToAppleProducts(jsonSource: String) -> [AppleProduct] { | |
if let data = jsonSource.data(using: .utf8) { | |
do { | |
if let jsonArray = try JSONSerialization.jsonObject(with: data, options: []) as? [[String: Any]] { | |
var appleProducts: [AppleProduct] = [] | |
for item in jsonArray { | |
if let model = item["model"] as? String, | |
let releaseDate = item["release_at"] as? String, | |
let discontinuedDate = item["discontinued_at"] as? String, | |
let id = item["id"] as? Int, | |
let category = item["category"] as? String, | |
let family = item["family"] as? String, | |
let image = item["image"] as? String { | |
let product = AppleProduct(model: model, releaseDate: releaseDate, discontinuedDate: discontinuedDate, id: id, category: category, family: family, image: image) | |
appleProducts.append(product) | |
} | |
} | |
return appleProducts | |
} | |
} catch { | |
print("Error al parsear el JSON: \(error)") | |
} | |
} | |
return [] | |
} | |
func uniqueCategoriesFromAppleProducts(_ products: [AppleProduct]) -> [String] { | |
let categories = Set(products.map { $0.category }) | |
return Array(categories) | |
} | |
func uniqueFamiliesFromAppleProducts(_ products: [AppleProduct]) -> [String] { | |
let families = Set(products.map { $0.family }) | |
return Array(families) | |
} | |
func filterAndSortProducts(_ products: [AppleProduct]) -> [AppleProduct] { | |
let filteredProducts = products.filter { $0.discontinuedDate.isEmpty } | |
let sortedProducts = filteredProducts.sorted { (product1, product2) in | |
if product1.releaseDate != product2.releaseDate { | |
return product1.releaseDate > product2.releaseDate | |
} else if product1.category != product2.category { | |
return product1.category < product2.category | |
} else { | |
return product1.family < product2.family | |
} | |
} | |
return sortedProducts | |
} | |
func filterAndSortProductsFirst(_ products: [AppleProduct]) -> [AppleProduct] { | |
let filteredProducts = products.filter { $0.discontinuedDate.isEmpty } | |
// Sort the filtered products by release date in descending order | |
let sortedProducts = filteredProducts.sorted { $0.releaseDate > $1.releaseDate } | |
var firstProductOfEachFamily: [AppleProduct] = [] | |
var seenFamilies: Set<String> = Set() | |
for product in sortedProducts { | |
if !seenFamilies.contains(product.family) { | |
seenFamilies.insert(product.family) | |
firstProductOfEachFamily.append(product) | |
} | |
} | |
return firstProductOfEachFamily | |
} | |
let appleProducts = parseJSONToAppleProducts(jsonSource: jsonSource) | |
print(appleProducts.count) | |
let uniqueCategories = uniqueCategoriesFromAppleProducts(appleProducts) | |
let uniqueFamilies = uniqueFamiliesFromAppleProducts(appleProducts) | |
let filteredAndSortedProducts = filterAndSortProductsFirst(appleProducts) | |
//print(uniqueCategories) | |
//print(uniqueFamilies) | |
for product in filteredAndSortedProducts { | |
print("Model: \(product.model)") | |
print("Release Date: \(product.releaseDate)") | |
print("Discontinued Date: \(product.discontinuedDate)") | |
print("ID: \(product.id)") | |
print("Category: \(product.category)") | |
print("Family: \(product.family)") | |
print("Image: \(product.image)") | |
print("---------\n") // Para separar cada producto en la salida | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Buy now: Just Updated
Neutral: Mid-product Cycle
Caution: Approaching End of Cycle
Dont'buy: Updates Soon