【问题标题】:About forKeyPath关于 forKeyPath
【发布时间】:2017-06-23 10:21:45
【问题描述】:

我关注this tutorial 来了解KVC。 在该教程中陈述如下

[someObject.someProperty setText:@"This is a text"];

 Using KVC:

[self setValue:@"this is a text" 
forKeyPath:@"someObject.someProperty.text"]

我的问题是:

1-我们在使用KVC的时候,为什么在forKeyPath中使用了“.text”?

2-does "forKeyPath" 应该总是引用我们拥有的对象,或者它可以是任何文本

【问题讨论】:

标签: objective-c key-value-observing kvc


【解决方案1】:

教程中的代码行:

[someObject.someProperty setText:@"This is a text"];

使用两种不同的方式来访问两个不同的属性,因此有点混乱。

声明一个属性,比如windowHeight,声明了两个方法,称为getter,用于获取属性值,以及setter,用于设置它。这些方法分别命名为propertyNamesetPropertyName,在我们的示例中为windowHeightsetWindowHeight。调用这些方法是使用属性的原始方式。你用这种风格写的教程是:

[[someObject someProperty] setText:@"This is a text"];

这会调用someObject 的getter someProperty,它返回另一个对象,比如someOtherObject,然后调用someOtherObject 的setter setText

后来在 Objective-C 的开发中点符号被引入作为 getter 和 setter 的简写。使用这种表示法,getter 调用[someObject someProperty] 可以写成someObject.someProperty,而setter 调用[someObject setSomeProperty:someValue] 可以写成赋值语句someObject.someProperty = someValue

在上述任何点表达式中,someObject 是一个返回对象引用的表达式。它可能是一个简单的变量引用;或者它可能是一个更复杂的表达式,包括另一个点表达式,它返回一个对象引用。

使用点符号编写您的教程行:

someObject.someProperty.text = @"This is a text";

与 KVC keypath 的相似之处现在应该很明显了。

您的教程选择在同一语句中混合使用原始和点符号样式,这可能会导致您的困惑和问题。

HTH

【讨论】:

    猜你喜欢
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 2012-01-19
    相关资源
    最近更新 更多