作为一名具有C ++基本经验的iOS开发人员,我正在比较这些语言的许多功能。我想知道为什么这个示例代码段中的变量名称为:
[bankInstance addObserver:personInstance
forKeyPath:@"accountBalance"
options:NSKeyValueObservingOptionNew
context:NULL];
作为@"字符串"传递,而不是通过指针传递?
答案 0 :(得分:2)
您注意到的不一定是变量名称。相反,它是一个属性(并且备份它的变量名可能是相同的名称,也可能是不同的,具体取决于属性的@synthesize。)
这允许不相关的类在定义的情况下访问另一个类的属性,例如只读,而不需要暴露类的其他部分。
答案 1 :(得分:2)
这是一条关键路径。它不一定是变量名;相反,它是一个属性列表。在这种情况下,列表只有一个项目,但在其他情况下,它可能类似于@"account.balance.inDollars"
,其中链中的每个元素都按名称查找其属性。
至于为什么你不写,比如说account.balance.inDollars
- 好吧,想想如果你在那里替换它会怎么做。在设置观察者并传递属性的当前值时,它将访问该属性。那不是我们想要的。相反,我们想告诉观察机制如何查找属性本身,以便它可以监视更改,并使用key-value coding执行此操作。 (这也允许您在Interface Builder中以图形方式设置绑定。)
答案 2 :(得分:0)
在Swift中,您可以使用#keyPath()
生成密钥路径字符串。
let keyPathString = #keyPath(BankAccount.accountBalance)
在编译时,()
内的标记将被检查为有效的密钥路径。
这比编写自己的密钥路径字符串文字要好得多,因为编译器会提醒您输入错别字或重构引起的错误。