Swift에서 키패스(keyPath)는 "미리 만들어진 경로"라는 개념을 가지고 있습니다.
간단하게 설명하자면 인스턴스가 보다 간단하고 쉽게 속성에 접근할 수 있도록 해주는 기능입니다.
키패스는 특정한 형태가 존재하며, 딕셔너리(Dictionary)방식으로 접근해야 합니다.
// 키패스 구현
var 키패스_이름 = \상위클래스.경로.경로.경로...
var centralCity_Path = \Continent.country.capital.centralCity.centralCityName
// 키패스 사용
상위 인스턴스[keyPath: 키패스]
continent[keyPath: centralCity_Path]
✅ 키패스(keyPath)가 필요 없는 경우
struct CompanyLocation{ var companyLocationName: String } var kim_CompanyLocation = CompanyLocation(companyLocationName: "종로") kim_CompanyLocation.companyLocationName // 종로
위의 코드에서는 키패스의 필요성을 못 느끼는 코드입니다.
그 이유는 인스턴스가 연속 프로퍼티(속성) 체인 없이 한 번의 체인으로 속성에 접근했기 때문입니다.
🤔그렇다면 연속 프로퍼티(속성) 체인이 발생하는 경우에는 어떨까??
✅ 키패스(keyPath)가 필요한 경우
struct Continent{ // 대륙 var continentName: String var country: Country } struct Country{ // 국가 var countryName: String var capital: Capital } struct Capital{ // 수도 var capitalName: String var centralCity: CentralCity } struct CentralCity{ // 주요 도시 var centralCityName: String } var centralCity = CentralCity(centralCityName: "종로") var capital = Capital(capitalName: "서울", centralCity: centralCity) var country = Country(countryName: "한국", capital: capital) var continent = Continent(continentName: "아시아", country: country) var kim_CompanyLocation = continent.country.capital.centralCity.centralCityName // 종로
위의 코드 같은 경우는 키패스의 필요성이 느껴지는 코드입니다.
인스턴스가
centralCityName
속성에 접근하기 위해서 4번의 연속 프로퍼티(속성) 체인을 사용했기 때문입니다. (var kim_CompanyLocation = continent.country.capital.centralCity.centralCityName
)특정 속성에 접근하기 위해 연속적인 프로퍼티(속성) 체인을 사용할 경우 사용하는 데 있어 불편하다는 단점과 코드의 가독성이 떨어진다는 단점이 존재하기 때문에 위의 경우에는 키패스를 사용하는 것을 추천합니다.
✅ 키패스(keyPath)를 사용한 경우
struct Continent{ // 대륙 var continentName: String var country: Country } struct Country{ // 국가 var countryName: String var capital: Capital } struct Capital{ // 수도 var capitalName: String var centralCity: CentralCity } struct CentralCity{ // 주요 도시 var centralCityName: String } var centralCity = CentralCity(centralCityName: "종로") var capital = Capital(capitalName: "서울", centralCity: centralCity) var country = Country(countryName: "한국", capital: capital) var continent = Continent(continentName: "아시아", country: country) // 미리 경로를 만들어 쉽게 접근: 키패스 let centralCity_Path = \Continent.country.capital.centralCity.centralCityName var kim_CompanyLocation = continent[keyPath: centralCity_Path] // 종로
인스턴스가 특정 속성에 접근하는 경로를 미리 구현하여 사용하기 때문에 모든 특정 속성의 경로를 반복적으로 구현할 필요가 없습니다.
아래처럼 하나의 키패스를 사용하여 어려 인스턴스가 사용
let centralCity_Path = \Continent.country.capital.centralCity.centralCityName // 키패스 var kim_CompanyLocation = continent[keyPath: centralCity_Path] var lee_CompanyLocation = continent[keyPath: centralCity_Path] var shin_CompanyLocation = continent[keyPath: centralCity_Path]