URLComponents를 사용하면 간편하게 URL 요소들을 다룰 수 있습니다.
물론 URLComponents를 사용하지 않고도 아래처럼 URL을 만들 수는 있습니다.
private func buildURL(post: String, id: String) -> URL? {
return URL(string: "https://ittingz.tistory.com/?post=\(post)&id=\(id)")
}
하지만 query item의 종류가 많아질 수록 일일이 string interpolator 형태로 작성하기도 번거롭고 오타가 나면 발견하기 어려울 수 있습니다.
URLComponents를 사용하면 어떻게 될 지 한 번 볼까요?
private func useURLComponents(post: String, id: String) {
var components = URLComponents(string: "https://ittingz.tistory.com/")
//queryItem들 추가
components?.queryItems = [
URLQueryItem(name: "post", value: "\(post)"),
URLQueryItem(name: "id", value: "\(id)")
]
//result에는 URL? 타입의 값 할당
let result = components?.url
}
먼저 base가 되는 url을 URLComponents initializer로 생성해주고,
queryItems function을 사용해서 뒤에 필요한 query item들을 추가해줍니다. 앞에서 String 형태로만 쭉 작성했던 것 보다 코드는 좀 더 길어도, base url이 무엇인지, 어떤 query item들이 추가되었는지 상황을 나누어서 볼 수 있기 때문에 좋은 것 같습니다.
다른 기능들도 한번 살펴보겠습니다.
1. PathVariable 추가하기
Path를 추가하려면 .path를 사용하면 됩니다.
다만 주의할 것은 추가하고 싶은 path명 앞에 "/"를 꼭 붙여줘야 합니다. 그렇지 않으면 components?.url가 nil이 됩니다.
//base url
var components = URLComponents(string: "https://ittingz.tistory.com/")
//주의: 추가하고 싶은 path명 앞에 "/"를 꼭 붙여줘야 합니다.
components?.path = "/intermidiate" //(O)
/*
components?.path = "intermidiate" //(X)
*/
print(components?.url)
//Print Optional(https://ittingz.tistory.com/intermidiate)
2. Port 추가하기
.port로 어떤 port를 사용할 것인지도 설정할 수 있습니다.
components?.port = 8080
print(components?.url)
//Print Optional(https://ittingz.tistory.com:8080/intermidiate)
URL의 요소들을 추가할 뿐만 아니라 전체 URL에서 원하는 요소들을 불러올 수도 있습니다.
1. QueryItems 가져오기
var components = URLComponents(string:
"https://ittingz.tistory.com:8080/intermidiate?post=post&id=1")
//components?.queryItems는 optional 형태이기 때문에 optional unwrapping 처리를 해줍니다.
let queryItems = components?.queryItems ?? []
for item in queryItems {
print("name: ", item.name)
print("value: ", item.value)
}
/* Prints
name: post
value: Optional("post")
name: id
value: Optional("1")
*/
2. PathVariable 가져오기
let path = components?.path
print(path)
//Prints Optional("/intermidiate/")
3. Port 가져오기
let port = components?.port
print(port)
//Prints Optional(8080)
4. Scheme, Host 가져오기
let scheme = components?.scheme
print(scheme)
let host = components?.host
print(host)
//Prints
//Optional("https")
//Optional("ittingz.tistory.com")
사용법을 알았으니 유용하게 사용해봐야겠습니다 :)
참고자료
https://stackoverflow.com/questions/51353322/swift-4-urlcomponents-not-connecting-path-variable
'Swfit' 카테고리의 다른 글
Substring 표현방법 (0) | 2022.12.02 |
---|---|
NavigationBar 색상 및 타이틀 색상 변경하기 (0) | 2022.11.12 |
Cannot find AF in scope - Alamofire 관련 에러 (0) | 2022.11.10 |
Protocol extension (0) | 2022.11.02 |
frame .zero로 설정하는 이유? (0) | 2022.10.31 |