如何取得OC可变数组中对象的成员变量的值?

在iOS练习中,我新建立了一个NSObjectJQCellStruct,声明了double类型的成员变量pa,在ViewController中生成了数次类的对象str,分别赋值了a的值,使用addObject:方法添加进了可变数组sarray中。

如果我现在想用stringWithFormat:方法,令某个label显示出数组的第istr对象中p的数值,应该怎么取得p
试了点语法和其他网上找的方法,都报错了,希望能够得到解答,谢谢!

添加语句是:

JQCellStruct *str = [[JQCellStruct alloc] init];
str.p = &(dPrice);
str.a = &(dAmount);

[_sarray addObject:str];

实际在程序中报错的语句是在tableView cellForRowAtIndexPath方法下的:

NSString *p = [NSString stringWithFormat:@"%ld",(long)_sarray[indexPath.row].p];

错误信息为:Property 'p' not found on object of type 'id'

阅读 5.4k
4 个回答

是 Objc 还是 swift?

swift:

struct Str {
    var a: Double
}

let str1 = Str(a: 1.5)
let str2 = Str(a: 4.2)

var mutableArray = [str1, str2]

let label  = UILabel()
label.text = "\(mutableArray[0].a)"

修改

这个你不需要用&这种方式来赋值,不然你拿到的类型就是id类型了,也就是指针,不是double了。

@interface JQCellStruct : NSObject

@property (nonatomic, assign) double p;
@property (nonatomic, strong) NSString *a;

@end 

JQCellStruct *str = [[JQCellStruct alloc] init];
str.p = dPrice;
str.a = dAmount;

[_sarray addObject:str];

NSString *p = [NSString stringWithFormat:@"%ld",(long)_sarray[indexPath.row].p];

NSValue包装struct

你是swift还是oc?oc的话一般不用struct. 用NSObject来包装对象。

@interface TypeA : NSObject

@property (nonatomic, assign) double a;

@end    

如果执意要用struct的话,可以转换一下。

typedef struct _TypeA {
    double a;
}TypeA;

NSMutableArray *array = ...

// add
TypeA a = { .a = 10 };
NSValue *value = [NSValue value:&a withObjCType:@encode(TypeA)];
[array addObject:value];

// get
TypeA b;
NSValue *vv = array[0];
[vv getValue:&b];

swift的话更简单了

struct TypeA {
 var a : Double
}

let a1 = TypeA(a: 1)
let a2 = TypeA(a: 2)

var array = [a1, a2]

let value = array[0].a
typedef struct HLTest {
    
    double a;
}HLTest;

    
NSMutableArray *temp = @[].mutableCopy;
for (NSInteger i = 0; i < 10; ++i) {
    HLTest str;
    str.a = arc4random();
    NSValue *value = [NSValue valueWithBytes:&str objCType:@encode(HLTest)];
    [temp addObject:value];
}

[temp enumerateObjectsUsingBlock:^(NSValue * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    HLTest str;
    [obj getValue:&str];
    NSLog(@"%f", str.a);
}];

报错的原因是_sarray[indexPath.row] 返回的类型是idNSObject*)。NSObject类没有一个叫做p的属性。在这里,你可以通过添加(JQCellStruct *)的方式告诉编译器返回的类型是JQCellStruct

[(JQCellStruct *)arr[0] p];
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题