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

时间:2011-05-15 10:56:36

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

如何在class-c?

中传递类的属性作为方法的参数

举个例子假设我有:

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

然后需要:

  1. 一种将属性的指示传递给方法的方法(例如,以字符串形式发送?)
  2. 方法中采用此方法(从上面的1开始)并将其用于(a)访问方法所具有的MyData实例中的此属性的值,PLUS(b)也更新属性。

3 个答案:

答案 0 :(得分:4)

属性将具有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)];

希望这会有所帮助。

答案 1 :(得分:2)

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

然后您可以通过键值编码访问指定的属性: 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)
}

答案 2 :(得分:0)

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