【问题标题】:range expands in multi level array [closed]范围在多级数组中扩展[关闭]
【发布时间】:2013-01-24 06:59:43
【问题描述】:

这是我的代码。

NSString* seats = @"NEWS";
NSMutableString *sp = [[NSMutableString alloc] initWithString:@"             "];
NSArray *dials=@[@[sp, sp, sp, sp], @[sp, sp, sp, sp]];
[dials[0][2] replaceCharactersInRange:NSMakeRange(5, 1) withString:[seats substringWithRange:NSMakeRange(3,1)]];
NSLog(@"dial 0 0 : %@",dials[0][0]);
NSLog(@"dial 0 1 : %@",dials[0][1]);
NSLog(@"dial 0 2 : %@",dials[0][2]);
NSLog(@"dial 0 3 : %@",dials[0][3]);

这是我的控制台读数。

2013-02-08 08:23:26.114 [29075:11303] dial 0 0 :      S       
2013-02-08 08:23:26.115 [29075:11303] dial 0 1 :      S       
2013-02-08 08:23:26.115 [29075:11303] dial 0 2 :      S       
2013-02-08 08:23:26.115 [29075:11303] dial 0 3 :      S       

我怎样才能获得以下读数,这正是我想要的?

2013-02-08 08:23:26.114 [29075:11303] dial 0 0 :              
2013-02-08 08:23:26.115 [29075:11303] dial 0 1 :              
2013-02-08 08:23:26.115 [29075:11303] dial 0 2 :      S       
2013-02-08 08:23:26.115 [29075:11303] dial 0 3 :              

【问题讨论】:

    标签: objective-c arrays


    【解决方案1】:

    只要这样做:

    NSArray *dials=@[@[sp, sp, [sp mutableCopy], sp], @[sp, sp, sp, sp]];
    

    知道为什么吗?如果您认为该数组仅包含重复的对象。每个指针都指向同一个对象,除了 dials[0][2],它指向一个复制的对象。

    允许将重复的对象放在同一个数组中,但在概念上可能是错误的。所以还要考虑复制所有的对象。

    另一种解决方案是将不可变数组替换为可变字符串,并将可变数组替换为不可变字符串,在这种情况下,您还可以放置重复的对象,并且要更改对象,您应该替换它:

    NSString *sp = @"             ";
    NSArray*dials=@[[@[sp, sp, sp, sp]mutableCopy], [@[sp, sp, sp, sp]mutableCopy]];
    NSString* replace= [dials[0][2] stringByReplacingCharactersInRange:NSMakeRange(5, 1) withString:[seats substringWithRange:NSMakeRange(3,1)]];
    [dials[0] replaceObjectAtIndex: 2 withObject: replace];
    

    【讨论】:

    • 好答案!然而,它是一个 set 不能多次拥有同一个对象,我没有看到 array 中的重复对象有任何问题(除了 OP 如何使用它本例)。
    • 是的,我同意它可以有多个对象,但我是说它在概念上值得商榷。
    • 因为我想编辑每个单独的空间,虽然我只是展示了一个位置来表达我的观点,你的意思是每个位置都需要使用[sp mutableCopy] 创建表盘吗?而且,除了像我正在使用的那种蛮力定义之外,还有什么技巧可以做到这一点吗?另外,如果您有时间,我想将整个表盘定义为另一个类 BSParam.h/.m 以包含在此处,但无法做到这一点。你能说怎么做吗?添加问题怎么样?
    • 是:具有可变字符串的不可变数组。或者另一个,恕我直言,经典的解决方案是一个带有不可变字符串的可变数组,这样每次你想改变一个字符串时,你只需替换它。
    • 它没有这个方法,因为它是不可变的。使用 stringByReplacingCharactersInRange 创建另一个对象并替换它。在编辑后的答案中添加了一个示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多