【问题标题】:How can I pass a property of a class as a parameter of a method in objective-c如何在objective-c中将类的属性作为方法的参数传递
【发布时间】:2011-05-15 10:56:36
【问题描述】:

如何在objective-c中将类的属性作为方法的参数传递?

举个例子,假设我有:

  • CoreData 托管对象类 MyData 具有相同类型的动态属性 PropA、PropB、PropC
  • 我有一个 utils 方法,它将执行计算并更新其中一个属性,它将 MyData 实例作为输入
  • 如何安排使 utils 方法可以接受在计算和更新中使用哪个属性的指示? (例如 PropB)

那么需要:

  1. 一种将属性指示传递给方法的方法(例如,作为字符串发送?)
  2. 方法中的一种方式来获取 this(从上面的 1 开始)并使用 this 来 (a) 在该方法具有的 MyData 实例中访问此属性的值,另外 (b) 也更新该属性。

【问题讨论】:

    标签: iphone objective-c core-data selector key-value-coding


    【解决方案1】:

    属性将具有 setter 和 getter 方法。在您的情况下,我假设 setPropA、setPropB、setPropC 用于 setter,而 PropA、PropB、PropC 用于 getter。

    然后我将字符串“PropA”传递给 util,表示我要访问名为 PropA 的属性。 该 util 可以通过

    id val = [aObj performSelector:NSSelectorFromString(@"PropA")];
    

    并通过

    设置属性
    [aObj performSelector:NSSelectorFromString(@"SetPropA") withObject:newValue];
    

    或者,您可以通过NSStringFromSelector() 将setter 和getter 作为参数传递,将选择器转换为NSString。例如,我通过 NSDictionary 传递 setter 和 getter。

    NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:
                              NSStringFromSelector(@selector(setPropA:)), kSetterKey,
                              NSStringFromSelector(@selector(PropA)), kGetterKey, nil];
    
    // inside myUtil
    NSString *setter = [userInfo objectForKey:kSetterKey];
    [aObj performSelector:NSSelectorFromString(setter) withObject:newValue];
    NSString *getter = [userInfo objectForKey:kGetterKey];
    id val = [aObj performSelector:NSSelectorFromString(getter)];
    

    希望这会有所帮助。

    【讨论】:

    • 感谢 Toro - 只是想知道使用这种选择器方法的优势是什么? Jorn 建议的 valueForKey 方法从表面上看似乎更简单?
    • 据我所知,在 iOS 中并不是所有的东西都符合 KVO 的 NSKeyValueCoding 协议。 NSObject 和 UIView 不符合该协议。
    【解决方案2】:

    是的,您可以将属性名称作为字符串传递。

    然后您可以通过键值编码访问指示的属性: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/KeyValueCoding/Articles/KeyValueCoding.html

    例子:

    - (void) myUtilMethod: (MyData *) myData
         forPropertyNamed: (NSString *) propName /* which property to operate on (1) */
    {
       id oldValue = [ myData valueForKey: propName]; // get value (2a)
    
       id newValue = ...; // your calculation here
    
       [myData setValue: newValue forKey: propName]; // set value (2b)
    }
    

    【讨论】:

      【解决方案3】:

      我不会直接绑定这两个类。您应该设置一个模式设计,允许您通过创建一个将在这两者之间进行接口的类来松散地将它们耦合在一起。

      【讨论】:

        猜你喜欢
        • 2021-02-05
        • 2010-11-13
        • 1970-01-01
        • 2020-09-16
        • 2023-03-13
        • 2017-07-29
        • 2014-07-14
        • 2020-04-21
        • 1970-01-01
        相关资源
        最近更新 更多