iOS

[Swift] : KVC ( Key - Value Coding )

SeorinY 2022. 10. 11. 14:51

KVC ( Key - Value Coding ) 란 무엇일까?

객체의 프로퍼티에 접근할 때 사용하는 간접적인 코딩 방식이다.

객체의 프로퍼티에 접근하는 방식은 직접적인 방식과, 간접적인 방식으로 볼 수 있다.

 

직접적인 방식은 아래 코드처럼 우리가 흔히 사용하는 코딩 방식이다.

struct Human{
    var name : String
    var profile : Profile
}
struct Profile{
    var job : String
}

var profile = Profile(job: "")
var seorin = Human(name: "", profile: profile)


//seorin 객체의 프로퍼티에 직접 접근을 함!!
seorin.name = "seorin"
seorin.profile.job = "Developer"

seorin.name                 //seorin
seorin.profile.job           //Developer

 

 

이제 간접적인 방식인 Key-Value Coding 대해 알아보자.

Key Value Coding에는 Key를 사용하는 방법KeyPath를 사용하는 방법이 있다.

 

Key를 사용하는 코드를 살펴보자.

Key는 Object-C 의 문법이기 때문에  NSObject 클래스를 상속받고, 프로퍼티는 @objc를 사용해주도록 하자!

class Human : NSObject{
    @objc var name : String
    @objc var profile : Profile
    override init(){
        name = ""
        profile = Profile()
    }
}
class Profile : NSObject{
    @objc var job : String
    override init(){
        job = ""
    }
}
let profile = Profile()
let seorin = Human()

// 간접적으로 접근하는 방법 - Key
seorin.setValue("seorin", forKey: "name")
seorin.setValue(profile, forKey: "profile")
seorin.profile.setValue("Developer", forKey: "job")

seorin.value(forKey: "name")        //"seorin"
seorin.profile.value(forKey: "job")  //"Developer"

객체의 프로퍼티명을 Key 값으로 접근할 수 있다.

 

 

이제 KeyPath를 사용하는 코드를 살펴보자.

class Human{
    var name : String
    var profile : Profile
    init(){
        name = ""
        profile = Profile()
    }
}
class Profile{
    var job : String
    init(){
        job = ""
    }
}
let profile = Profile()
let seorin = Human()

 // 간접적으로 접근하는 방법 - KeyPath
seorin[keyPath: \.name] = "seorin"
seorin[keyPath: \.profile] = profile
seorin[keyPath: \.profile.job] = "Developer"
 
seorin[keyPath: \.name]          //"seorin"
seorin[keyPath: \.profile.job]   //"Developer"

KeyPath를 저장하여 재사용하면 조금 더 편하게 사용할 수 있을 것이다.

 

 

세 방식 모두 같은 결과를 가져오고 있지만 KVC 방식을 사용했을 때 장점은 뭘까?

Key값이 런타임 중에 결정되기 때문에,  객체간의 의존도를 낮출 수 있고, 반복되는 코드를 줄일 수 있다.

 

그 외에도 KVO 를 사용하기 위한 이유가 있다!