ios - 如何取得OC可变数组中对象的成员变量的值?
怪我咯
怪我咯 2017-04-18 09:06:25
[iOS讨论组]

在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'

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(4)
PHP中文网

是 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];
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号