-
[Swift] KeyPath, WritableKeyPath, ReferenceWritableKeyPath 차이와 구분해서 사용하기Swift 2023. 10. 25. 17:55
protocol SelfReturnable { associatedtype ReturnType func with<T>(_ keyPath: WritableKeyPath<Self, T>, _ value: T) -> ReturnType } extension SelfReturnable { func with<T>(_ keyPath: WritableKeyPath<Self, T>, _ value: T) -> Self { var copy = self copy[keyPath: keyPath] = value return copy } } protocol RefSelfReturnable { associatedtype ReturnType func with<T>(_ keyPath: ReferenceWritableKeyPath<Self, T>, _ value: T) -> ReturnType } extension RefSelfReturnable { func with<T>(_ keyPath: ReferenceWritableKeyPath<Self, T>, _ value: T) -> Self { let copy = self copy[keyPath: keyPath] = value return copy } }
struct ValueItem: SelfReturnable { let name: String var age: Int } final class RefItem: RefSelfReturnable { let name: String var age: Int init(name: String, age: Int) { self.name = name self.age = age } } let valueItem = ValueItem(name: "kim", age: 1) let refItem = RefItem(name: "lee", age: 2) let newValueItem = valueItem.with(\.age, 11) let newRefItem = refItem.with(\.age, 12) dump(newValueItem) dump(newRefItem)
결론 ->
ReferenceWritableKeyPath은 클래스에 사용하면 됨
하지만 그렇다고 WritableKeyPath 를 클래스에 사용하지 못하는게 아님.
var 로 선언된 변수에는 다 사용가능.
일반적으로 단순히 접근하는 경우는 KeyPath를 사용해도 상관 없음
'Swift' 카테고리의 다른 글
[TIL] CoreData 꿀팁 (0) 2024.01.05 [Swift] @dynamicMemberLookup 써보기 (0) 2023.10.26 [Swift] NSPredicate format placeholders (0) 2023.10.25 [Combine] AsyncPublisher 란? (0) 2023.10.24 [Swift] ThreadSafe 한 Class 만들기 (1) 2023.10.24