ios개발

<ios개발> Swift언어: keyPath, 키패스, \

studying develop 2020. 12. 9. 02:45

[learnappmaking.com/swift-keypath-how-to/] 처음에 \ 이 기호가 뭔지 이름도 몰라서 검색하기가 힘들었다...

키패스는 무엇인가?

struct Videogame {
    var title:String
    var published:String
    var rating:Double
}

let cyberpunk = Videogame(title: "Cyberpunk 2077", published: "2020", rating: 5)
let titleKeyPath = \Videogame.title

print(cyberpunk[keyPath: titleKeyPath]) // Output: Cyberpunk 2077

 

Keypaths in Swift are a way of storing a reference to a property, as opposed to referencing property’s value itself. It’s like working with the name of the property, and not its value.

 

스위프트에서 키패스는 프로퍼티의 레퍼런스값을 저장하는 방법이다 (c로 치면 포인터라 보면 될듯), 원래 프로퍼티가  값 자체를 참조하는것과 반대된다. 마치 이건 프로퍼티의 이름을 따라 작동하는 것이다 값을 따라 작동하는게 아니라.

 


그럼 키패스는 왜 사용하는가?

 

  • … what if the "title" key doesn’t exist in the dictionary?
  • … what if the returned value is of a different type than you expect?
  • … what if you make a typo and type "ttile"?

딕셔너리를 사용할때의 단점을 보완해준다 생각하면된다.

 

  • 딕셔너리의 키 값이 만약 존재하지 않는 값일수도 있잔아?
  • 딕셔너리에서 반환된 값이 내가 기대한 타입과 다르다면?
  • 키에 title 입력하려다 ttile로 오타낸다면??

extension Array
{
    func sorted<Value: Comparable>(
        keyPath: KeyPath<Element, Value>,
        by areInIncreasingOrder:(Value, Value) -> Bool) -> [Element] {

        return sorted { areInIncreasingOrder(
            $0[keyPath: keyPath], $1[keyPath: keyPath]) }
    }
}

let games = [
    Videogame(title: "Cyberpunk 2077", published: "2020", rating: 999),
    Videogame(title: "Fallout 4", published: "2015", rating: 4.5),
    Videogame(title: "The Outer Worlds", published: "2019", rating: 4.4),
    Videogame(title: "RAGE", published: "2011", rating: 4.5),
    Videogame(title: "Far Cry New Dawn", published: "2019", rating: 4),
]

for game in games.sorted(keyPath: \Videogame.rating, by: >) {
    print(game.title)
}

이 코드를 볼때까지 오해한건데, 맨 아래 for문을 보면, \Videogame.rating으로 사용한다. 음 그니까 어떤 구조체 타입으로 변수를 선언하던 간에, \변수로 사용하는게 아니라 \구조체타입이름 으로 사용하는거라 볼수있는거 같다.