【问题标题】:Why variables and methods are passed as strings in objective-c?为什么在objective-c中变量和方法作为字符串传递?
【发布时间】:2014-04-16 00:05:22
【问题描述】:

作为一名具有 C++ 基本经验的 iOS 开发人员,我正在比较这些语言的许多特性。我想知道为什么这个示例 sn-p 代码中的变量名:

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

作为@"string" 传递,而不是通过指针传递?

【问题讨论】:

    标签: objective-c kvc


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        let keyPathString = #keyPath(BankAccount.accountBalance)
        

        在编译时,() 中的标记将被检查为有效的密钥路径。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-07
          • 1970-01-01
          • 2020-03-25
          • 2011-03-30
          • 1970-01-01
          相关资源
          最近更新 更多