GET요청
예시코드이다. func performGetRequest(urlString : string) async throws -> Data{
// 함수선언에 throw키워드를 사용하면 해당 함수가 오류를 던질 수 있음을 나타낸다.
// throws 함수를 호출할때는 try 키워드를 사용해야한다. 호출자에게 오류처리의 책임을 부여한다.
guard let url = URL(string : urlString) else{
// 만약에 URL() 의 결과가 nil이라면
throw URLError(.badURL)
// 예외를 던진다.
}
let (data, response) = try await URLSession.shared.data(from : url)
guard let httpResponse = response as? HTTPURLResponse,
// 2개 검사
(200...299).contains(httpResponse.statusCode) else{
// 만약에 조건을 하나라도 못맞추면
throw URLError(.badServerResponse)
}
return data
}
Task{
do{
let data = try await performGetRequest(urlString : "https// api.....com")
let user = try JSONDecoder().decode(디코딩할 타입, json이 저장되어있는 데이터)
print("data : \(user)")
}catch{
print("error : \(error)")
// 암시적 바인딩
}
}
let jsonString = """
{
"id":"sewon",
"age":"22",
.
.
.
}
"""
// 런타임 널참조 에러가 일어날 가능성이 있는 코드
let jsonData = jsonString.data(using : .utf8)!과 같이 할 수 있기는 한데 이 경우에 jsonString이 nil이면 위험하다.
// guard let으로 에러가 일어날 가능성을 줄인 코드
guard let jsonData = jsonString.data(using: .utf8) else{
throw 에러
}
를 해서 jsonData를 쓰는 것이 안전하다.
func performPOSTRequest(urlString : String, body: [String:Any]) async throws -> Data{
// throws : 이 함수를 호출할 때는 오류처리에 대한 명시를 꼭 해야한다.
// body : key는 String 값은 아무값이나 가능
// async : 비동기
guard let url = URL(string : urlString) else{
throw URLError(.badUrl)
}
var request = URLRequest(url : url)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
let jsonData = try JSONSerialization.data(withJSONObject : body
}
as?
: 타입캐스팅 연산자
as?
는 swift의 조건부 다운캐스팅 연산자
이다.
한 타입의 인스턴스를 다른 타입의 인스턴스로 취급하려고 할때 사용되고,
캐스팅이 성공
하면 옵셔널 형태로 캐스팅된 값을 반환한다.
캐스팅이 실패
하면 nil
을 반환한다.
contains
컬렉션 메서드
contains
는 swift의 시퀀스
나 컬렉션
에서 사용되는 메서드이다.
특정요소가 컬렉션에 포함
되어있는지 확인한다.
주어진 조건을 만족하는 요소가 하나라도 있으면 true
, 그렇지 않으면 false
반환
(200...299)
는 200부터 299까지의 범위를 나타내는 Range<Int>
타입이다.
throws
를 함수선언에 넣음으로써 오류처리를 강제 했기 때문에 호출하는 코드에서는 다음의 형태가 된다. try
를 의무적으로 사용해서 오류처리를 꼭 해주어야한다.
do {
let data = try await performGetRequest(urlString: "https://api.example.com/data")
// 데이터 처리
} catch {
// 오류 처리
print("Error occurred: \(error)")
}