KVC,全称是 Key-Value Coding(键值编码),是 Apple 在 Objective-C 和 Swift 中引入的一种间接访问对象属性的机制。它允许使用字符串(key)来 动态访问或修改对象的属性。
基础用法
KVC 允许这样操作:
object.setValue("张三", forKey: "name")
let value = object.value(forKey: "name")
这相当于:
object.name = "张三"
let value = object.name
但 KVC 的优势在于:不需要在编译时知道这个属性,只要运行时能用字符串访问即可。
Swift 中的 KVC 使用要求
1、类必须继承自 NSObject。
2、被访问的属性必须是 @objc 修饰 的(或者是自动桥接到 Objective-C 的类型)。
import Foundation
class Person: NSObject {
@objc var name: String = ""
@objc var age: Int = 0
}
let person = Person()
person.setValue("李四", forKey: "name")
person.setValue(30, forKey: "age")
print(person.name) // 输出:李四
print(person.value(forKey: "age")!) // 输出:30
Swift 中的 KVC 常见用途
1、绕过只读属性限制(比如 isExpanded)
例如 NSSavePanel.isExpanded,不能直接赋值,但可以通过 KVC 修改:
panel.setValue(true, forKey: "isExpanded")
2、动态属性访问
例如用于配置数据模型、UI绑定等,不必写死访问路径。
KVC 的风险
使用字符串访问属性,拼写错误不会报错,容易出错。
如果 key 不存在,会引发运行时错误。
对私有属性使用 KVC,可能会违反封装原则或造成不稳定。
KVC 与 SwiftUI 的区别
KVC 是 Foundation / AppKit / UIKit 中的技术,不直接用于 SwiftUI 的数据绑定。SwiftUI 使用的是 @State、@Binding、@ObservedObject 等“声明式”绑定。
总结
KVC 是一种强大的“反射式”技术,可以用字符串动态访问和修改对象属性,适合处理 UI 控件、模型类和一些绕过系统限制的场景。
此外, KVC还有对应的“配套技术” ——KVO(Key-Value Observing),用于监听属性变化。