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)")
}