0

As an iOS developer with a basic experience in C++ I am comparing many features of the languages. I'm wondering why variable names in this sample snippet of code:

[bankInstance addObserver:personInstance
              forKeyPath:@"accountBalance"
              options:NSKeyValueObservingOptionNew
              context:NULL];

are passed as a @"string", not by pointer for example?

4

3 回答 3

2

您注意到的不一定是变量名。相反,它是一个属性(并且支持它的变量名称可能相同或可能不同,具体取决于属性的@synthesize)。

这允许不相关的类在定义的情况下(例如只读)访问另一个类的属性,而无需公开该类的其他部分。

于 2014-04-16T00:08:54.577 回答
2

那是一条关键路径。它不一定是变量名;相反,它是一个属性列表。在这种情况下,列表只有一项,但在其他情况下,它可能类似于@"account.balance.inDollars",其中链中的每个元素都通过名称查找其属性。

至于为什么你不只是写,比如说,account.balance.inDollars——好吧,想想如果你在那里替换它会做什么。当您设置观察者并传递属性的当前值时,它将访问该属性。那不是我们想要的。相反,我们想告诉观察机制如何查找属性本身,以便它可以观察变化,它通过键值编码来做到这一点。(这也允许您在 Interface Builder 中以图形方式设置绑定。)

于 2014-04-16T00:19:44.803 回答
0

在 Swift 中,您可以使用它#keyPath()来生成密钥路径字符串。

let keyPathString = #keyPath(BankAccount.accountBalance)

在编译时,()将检查其中的令牌是否是有效的密钥路径。

这比编写自己的键路径字符串文字要好得多,因为编译器会提醒您由拼写错误或重构引起的错误。

于 2017-02-09T00:50:04.253 回答