본문 바로가기
Swfit

URLComponents

by GGShin 2022. 11. 11.

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

 

Swift 4 URLComponents Not Connecting Path Variable

I have a Swift 4 project that I'm trying to learn a few new things and incorporate them at them same time, however I am stuck on something I just can't seem to work out. import Foundation protocol

stackoverflow.com

 

반응형

'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