对于基于唯一整数键的数据集,我有一个未确定的大小.
我想使用NSMutableArray快速查找,因为我的所有键都是基于整数的.
我想做这个.
NSMutableArray* data = [NSMutableArray array]; // just create with 0 size
Run Code Online (Sandbox Code Playgroud)
然后人们会开始用整数索引向我扔数据(都是唯一的)所以我只想做这样的事......
if ([data count] < index)
[data resize:index]; // ? how do you resize
Run Code Online (Sandbox Code Playgroud)
并调整数组大小,以便我可以...
[data insertObject:obj atIndex:index];
Run Code Online (Sandbox Code Playgroud)
最后一个尺寸和新尺寸之间的所有槽都为零,最终将在以后填充.
所以我的问题是如何调整现有的大小NSMutableArray?
谢谢,罗马
NSArray具有查找指定索引的对象的有用方法
// To find objects by indexes
- (id)objectAtIndex:(NSUInteger)index
- (NSArray *)objectsAtIndexes:(NSIndexSet *)indexes
// To find index by object
- (NSUInteger)indexOfObject:(id)anObject
Run Code Online (Sandbox Code Playgroud)
但是,我想获得NSIndexSet给定对象的(多个索引).就像是:
- (NSIndexSet *)indexesOfObjects:(NSArray *)objects
Run Code Online (Sandbox Code Playgroud)
此方法不存在NSArray.我错过了什么吗?有人知道另一种标准方法吗?否则我必须将其写为类别方法.
我有一个类歌曲,其属性为Title,Key,Artist等.没有方法.我遍历歌曲信息数据库并为每个创建一个Song对象,填充属性,然后将Song对象存储在NSArray中.
然后我想,为什么不只是有一个具有所有相同属性的结构歌曲而不是类宋.这样做会消除类文件,using类的.m文件中的#import Song行,以及需要alloc,init,release.
另一方面,我必须将struct定义放在可能需要它的每个类中.(除非有一些全局可访问的位置 - 是否存在?)此外,结构是否可以存储在NSArray中?
好吧,这有点模糊,但它让我头疼.
如果你有一个字符串数组
{@"1", @"2", @"4"}
Run Code Online (Sandbox Code Playgroud)
而且你有一个Recipe对象数组
{ {recipe_name:@"Lasagna", recipe_id:@"1"}
{recipe_name:@"Burger", recipe_id:@"2"}
{recipe_name:@"Pasta", recipe_id:@"3"}
{recipe_name:@"Roast Chicken", recipe_id:@"4"}
{recipe_name:@"Sauerkraut", recipe_id:@"5"}
}
Run Code Online (Sandbox Code Playgroud)
我将如何使用第一个数组创建一个这样的数组:
{@"Lasagna", @"Burger", @"Roast Chicken"}
Run Code Online (Sandbox Code Playgroud)
换句话说,它是取第一个数组中的数字并创建一个recipe_names数组,其中recipe_id匹配数字......
我有时喜欢将IB元素组织成NSArrays主要是为了帮助我组织我的元素.通常,不同类别的对象使它们彼此成为相同的数组.虽然这是一种方便的组织方式,但我似乎无法理解为什么如果我有这样的数组:
NSArray *array = [NSArray arrayWithObjects:((UITextField *)textField), ((UISegmentedController *)segmentedController), nil];
Run Code Online (Sandbox Code Playgroud)
当我放置这样的for循环时,为什么我得到"不响应选择器"消息:
for (UITextField *text in array) {
[text setText:@""];
}
Run Code Online (Sandbox Code Playgroud)
该for循环似乎要传递是类的不是对象UITextField.
如果指定数组中的所有对象都通过循环,则声明对象类的重点是什么?
编辑仅供参考,这就是我现在处理它的方式:
for (id *object in array) {
if ([object isMemberOfClass:[UITextField class]]) {
foo();
} else if ([object isMemberOfClass:[UISegmentedController class]) {
bar();
}
}
Run Code Online (Sandbox Code Playgroud) 是否可以使用[idx]访问NSArray的对象?我有一个使用[]样式索引的标准库,我不想重写整个库以适应ObjC的objectAtIndex:方法.
如, NSArray *obj = [NSArray ...]; id item = obj[0];
陷入一个有趣的小问题.我正在编写一个方法来过滤数组到唯一对象:
- (NSArray*)distinctObjectsByAddress {
NSSet* uniqueSet = [NSSet setWithArray:self];
NSArray* retArray = [uniqueSet allObjects];
return retArray;
}
Run Code Online (Sandbox Code Playgroud)
并写了一个单元测试来检查:
- (void)testDistinctObjectsByAddress5 {
Person* adam1 = [[Person alloc] initWithFirstName:@"adam" lastName:@"adam" andParent:nil];
Person* adam2 = [[Person alloc] initWithFirstName:@"adam" lastName:@"adam" andParent:nil];
testPersonArray = [NSArray arrayWithObjects:adam1,adam2, nil];
NSArray* checkArray = [testPersonArray distinctObjectsByAddress];
STAssertEquals([checkArray count], [testPersonArray count], @"Array %@ counts should match %@ %@",checkArray,adam1,adam2);
}
Run Code Online (Sandbox Code Playgroud)
很简单.有趣的是,测试通过的时间大约有80-90%,并且每次都会失败,因为该distinctObjectsByAddress方法只返回一个对象.我已经能够跟踪它,[NSSet setWithArray:self]但我也能够验证两个人对象是两个不同的对象(至少他们有不同的地址).我假设这setWithArray:只是做一个基本的地址比较,但我不明白为什么它有时会产生两个像它应该的对象,有时只产生一个.
我刚试过的东西正在改变,adam2所以名字和名字并不完全相同adam1.这似乎解决了错误.当对象在逻辑上相同时,这是否指向某种编译器优化?
我有一个NSArray,它给了我以下数据:
01/14/2013 13:28:06.559 IUser Reader [71164: c07] (
{
"id_acompanhante" = "";
"id_evento" = 34;
"user_id" = 1;
"inserido_por" = "Himself";
name = iUser;
status = done;
type = User;
}
{
"id_acompanhante" = 1;
"id_evento" = 34;
"user_id" = 1;
"inserido_por" = iUser;
name = "Mayara Roca";
status = naofeito;
type = companion;
}
)
Run Code Online (Sandbox Code Playgroud)
如何将此数据播放到NSMutableArray并在每个项目中添加另一个字段.例:
{
"id_acompanhante" = "";
"id_evento" = 34;
"user_id" = 1;
"inserido_por" = "Himself";
name = IUser;
status = done;
type = User;
tag …Run Code Online (Sandbox Code Playgroud) 这些是我的示例NSStrings(解析成数组),简化.
单个字符串对象被解析为"STRING1,STRING2然后DATE TIME然后 - A:VALUE",例如:
The name of first value, first 17/04/2013 11:30:00 - A:30.0 // sometimes there is a comma after first string
The name of second value 17/04/2013 11:00:00 - A:20.0 // sometimes there is NOT a comma after first string
Name of third value 17/04/2013 10:30:00 - A:40.0
Fourth 17/04/2013 09:40:00 - A:50.0
Fifth value 17/04/2013 05:00:00 - A:10.0
Run Code Online (Sandbox Code Playgroud)
好吧,我需要提取STRING或STRING的单独值,STRING:
The name of first value, first
The name of second value
Name of third value
Fourth
Fifth …Run Code Online (Sandbox Code Playgroud) 我花了整个下午的时间撞到墙上,试图弄清楚为什么这门课的解码失败了.该类有一个属性,它是Foo对象的NSArray.Foo符合NSSecureCoding,我已成功编码并解码了该类.我在initWithCoder中收到错误:表示无法解码类Foo.通过一些实验,我发现我需要将[Foo类]添加到initWithCoder:为了使它工作.也许这会帮助那些遇到同样问题的人.我的问题是,为什么这是必要的?我没有发现在Apple的文档中这是必要的.
#import "Foo.h"
@interface MyClass : NSObject <NSSecureCoding>
@property (nonatomic) NSArray *bunchOfFoos;
@end
@implementation MyClass
static NSString *kKeyFoo = @"kKeyFoo";
+ (BOOL) supportsSecureCoding
{
return YES;
}
- (void) encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeObject:self.bunchOfFoos forKey:kKeyFoo];
}
- (id) initWithCoder:(NSCoder *)decoder
{
if (self = [super init])
{
[Foo class]; // Without this, decoding fails
_bunchOfFoos = [decoder decodeObjectOfClass:[NSArray class] forKey:kKeyFoo];
}
return self;
}
@end
Run Code Online (Sandbox Code Playgroud)