据我所知,在 Objective-C 中,有多种方法可以设置属性(或键)的值。如果给定属性的名称是“foo”,我主要会执行以下操作:
[object setFoo:@"value"];
或者甚至类似:
object.foo = @"value";
但是,在某些情况下,我看到过他们使用它的代码:
[object setValue:@"value" forKey:@"foo"];
这两种方法之间的确切区别是什么(除了 Xcode 自动完成第一种方法之外)?
另外,使用第二种方法是否安全?(setValue:forKey:)
感谢您花时间阅读此问题。我非常感谢您的帮助。
最佳答案
根据Apple官方文档,Key-Value Coding的定义如下:
键值编码是一种间接访问对象属性的机制,使用字符串来标识属性,而不是通过调用访问器方法或直接通过实例变量访问它们。
让我们通过一些简单的例子来看看:
假设我们有一个名为firstname的属性,并且我们想要将值John分配给它。通常,我们会在代码中编写这样的内容:
self.firstname = @"John";
或者这个:
_firstname = @"John";
很熟悉吧?现在,使用 KVC 机制,上面的分配将类似于下一个:
[self setValue:@"John" forKey:@"firstname"];
如果仔细观察,这看起来类似于我们为字典设置值的方式,或者将标量值和结构转换为 NSValue 对象的方式。如您所见,我们为键名字设置了值 John。再举一个例子:
[someObject.someProperty setText:@"This is a text"];
使用 KVC:
[self setValue:@"This is a text" forKeyPath:@"someObject.someProperty.text"];
在这两个示例中,我们不是直接将值(第一个示例)设置为属性或使用属性的 setter 方法(第二个示例),而是简单地将值与键或键路径匹配(有关键和键路径的更多信息,请参阅一会儿)。正如您所假设的,因为我们使用键和值,所以上述技术称为键值编码。
我希望您能了解这种方法及其区别。 :)
关于ios - 设置值 :ForKey: instead of set(whatever)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35473196/