키패스(keyPath)

썹스·2022년 12월 20일
1

Swift 문법

목록 보기
67/68

키패스(keyPath)

Swift에서 키패스(keyPath)는 "미리 만들어진 경로"라는 개념을 가지고 있습니다.

간단하게 설명하자면 인스턴스가 보다 간단하고 쉽게 속성에 접근할 수 있도록 해주는 기능입니다.

키패스는 특정한 형태가 존재하며, 딕셔너리(Dictionary)방식으로 접근해야 합니다.

// 키패스 구현
var 키패스_이름 = \상위클래스.경로.경로.경로...
var centralCity_Path = \Continent.country.capital.centralCity.centralCityName

// 키패스 사용
상위 인스턴스[keyPath: 키패스]
continent[keyPath: centralCity_Path]

📌 키패스(keyPath)의 필요성 및 사용

✅ 키패스(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]

profile
응애 나 코린이(비트코인X 코딩O)

0개의 댓글