- Xcode Version 12.4 (12D4e)
- Swift 5、Swift
https://jsonplaceholder.typicode.com/users
[ { "id": 1, "name": "Leanne Graham", "username": "Bret", "email": "Sincere@april.biz", "address": { "street": "Kulas Light", "suite": "Apt. 556", "city": "Gwenborough", "zipcode": "92998-3874", "geo": { "lat": "-37.3159", "lng": "81.1496" } }, "phone": "1-770-736-8031 x56442", "website": "hildegard.org", "company": { "name": "Romaguera-Crona", "catchPhrase": "Multi-layered client-server neural-net", "bs": "harness real-time e-markets" } }, .....中略....... "phone": "024-648-3804", "website": "ambrose.net", "company": { "name": "Hoeger LLC", "catchPhrase": "Centralized empowering task-force", "bs": "target end-to-end models" } } ]
https://jsonplaceholder.typicode.com/todos
[
{
"userId": 1,
"id": 1,
"title": "delectus aut autem",
"completed": false
},
{
"userId": 1,
"id": 2,
"title": "quis ut nam facilis et officia qui",
"completed": false
},
.....中略.......
{
"userId": 10,
"id": 200,
"title": "ipsam aperiam voluptates qui",
"completed": false
}
]
extension URLSession {
enum CustomError: Error {
case invalidUrl
case invalidData
}
func request<T: Codable>(
url:URL?,
expecting: T.Type,
completion: @escaping (Result<T, Error>) -> Void
) {
guard let url = url else {
completion(.failure(CustomError.invalidUrl))
return
}
let task = dataTask(with: url) { data, _, error in
guard let data = data else {
if let error = error {
completion(.failure(error))
} else {
completion(.failure(CustomError.invalidData))
}
return
}
do {
let result = try JSONDecoder().decode(expecting, from: data)
completion(.success(result))
}
catch {
completion(.failure(error))
}
}
task.resume()
}
}
struct User: Codable {
let name: String
let email: String
}
struct ToDoListItem: Codable {
let title: String
let completed: Bool
}
// User
func fetch() {
URLSession.shared.request(
url: Constants.usersUrl,
expecting: [User].self
) { [weak self] result in
switch result {
case .success(let users):
DispatchQueue.main.async {
self?.models = users
self?.table.reloadData()
}
case .failure(let error):
print(error)
}
}
}
// ToDoList
func fetchItems() {
URLSession.shared.request(
url: Constants.todolistUrl,
expecting: [ToDoListItem].self
) { [weak self] result in
switch result {
case .success(let items):
DispatchQueue.main.async {
self?.models = items
self?.table.reloadData()
}
case .failure(let error):
print(error)
}
}
}