【问题标题】:How to assign the NSArray string object values to other NSString variables如何将 NSArray 字符串对象值分配给其他 NSString 变量
【发布时间】:2012-03-14 12:54:01
【问题描述】:
NSMutableArray *nameArray = [[NSMutableArray alloc] init];
[nameArray addObject:@"abc"];
[nameArray addObject:@"cdf"];
[nameArray addObject:@"jkl"];

//Use a for each loop to iterate through the array
for (NSString *s in nameArray) {
    NSLog(@"value is %@", s);
}

上面的代码显示了nameArray的所有值。但我想将所有这些值分配给这些 NSString:

NSString *a;
NSString *b;
NSString *cd;

一个数组可以有1个或多个元素,但不超过5个。

实际上,我有 5 个按钮,单击每个按钮都会向 NSMutableArray 添加一个 NSString 值(值分别为:f1、f2、f3、f4 和 f5)。现在,如果他在一天内单击 2 个按钮或 3 个或 5 个按钮,则由用户决定。现在所有这些值都将保存在 NSMutableArray 中(可以是 1 或 2,但不超过 5)。该 NSMutableArray 将保存在 NSUserDefaults 中。这个 NSMutableArray 将用于我有一些 UIImageView(1、2、3、4 和 5)的另一个视图中。现在,我将从该 Array(f1,f2,f3) 中获取字符串值。如果是 f1 则将图像分配给 UIImage 1,如果是 f3 则分配给图像 3,依此类推。

如何做到这一点?

【问题讨论】:

  • 你为什么要这个?因为数组可能包含超过 3 个元素,那么呢?
  • 因为这些值需要分配给其他变量以供进一步使用,例如标签文本。是的,你是对的,但每个数组的元素不会超过 5 个。它可以是 1 个或更多,但不能超过 5 个。我该如何解决这个问题。?
  • 那么为什么不这样做myLabel.text = [nameArray objectAtIndex:0]; - 通过将它们分配给其他指针,您将面临内存管理错误的风险:(
  • 是的,但我可能需要将这些值保存到 NSUserDefaults
  • 我仍然有一种印象,即我们正在为一个可以以更有效的方式解决的问题提供答案。如果您能更详细地向我们描述您想要实现的目标,也许我们可以为您提供更好的帮助。

标签: iphone objective-c ios xcode


【解决方案1】:

我会这样做:

NSArray *array = [NSArray arrayWithObjects:@"A", @"B", @"C", @"D", @"E", nil];
NSString *a = nil, *b = nil, *c = nil, *d = nil, *e = nil;
NSUInteger idx = 0;

for ( NSString *string in array )
{
    switch ( idx++ ) {
        case 0: a = string; break;
        case 1: b = string; break;
        case 2: c = string; break;
        case 3: d = string; break;
        case 4: e = string; break;
    }
}

【讨论】:

  • 嗨,尼古拉斯,谢谢你,你能告诉我,即使元素数量不同,有时是 4,有时是 2,这段代码也能正常工作。
  • 是的,它适用于数组中任意数量的对象。如果数组小于 5,未分配的变量将等于 nil。如果数组更大,其他值将被忽略。
【解决方案2】:

因为您的数组中至少有一个元素:

 NSString *a = (NSString *)[nameArray objectAtIndex:0];

最多有五个元素:

 for(int i = 1;i<[array count];i++)
 {
      if(i == 1)
      {
           NSString *b = (NSString *)[nameArray objectAtIndex:1];
      }
      else if(i == 2)
      {
           NSString *c = (NSString *)[nameArray objectAtIndex:2];
      }
      else if(i == 3)
      {
            NSString *d = (NSString *)[nameArray objectAtIndex:3];
      }
      else if(i == 4)
      {
           NSString *e = (NSString *)[nameArray objectAtIndex:4];
      }
 }

【讨论】:

  • 是 tonio.mg,thanx,但问题是我的数组有 1 个或更多但不超过 5 个元素。那么如何解决
【解决方案3】:
a = [nameArray objectAtIndex:0];
b = [nameArray objectAtIndex:1];
cd = [nameArray objectAtIndex:2];

如果您想将数组元素放入具有不同名称的单独变量中,目标 c 中没有自动化(与 JavaScript 不同),因为它是编译语言而不是解释语言。您可以使用 NSDictionary 实现类似的功能,即使用字符串或您想要的任何类型“索引”对象。

【讨论】:

  • 但是,如果您更准确地向我们解释您想要做什么,也许我们可以为您提供更有效/更“正确”的解决方案。
  • 实际上,我有 5 个按钮,点击每个按钮都会向 NSMutableArray 添加一个 NSString 值(值为:f1、f2、f3、f4 和 f5)。现在,如果他在一天内单击 2 个按钮或 3 个或 5 个按钮,则由用户决定。现在所有这些值都将保存在 NSMutableArray 中(可以是 1 或 2,但不超过 5)。该 NSMutableArray 将保存在 NSUserDefaults 中。这个 NSMutableArray 将用于我有一些 UIImageView(1、2、3、4 和 5)的另一个视图中。现在,我将从该 Array(f1,f2,f3) 中获取字符串值。如果是 f1,则图像将分配给 UIImage 1,如果是 f3,则分配给图像 3,依此类推
  • 如果你只需要用户是否点击了按钮的信息,我会选择一个大小为 5 的固定长度数组。当你加载按钮时,你会填充所有元素您的数组为 0。然后,当用户单击说第三个按钮时,您将数组的第三个元素设置为 1。在 UIImageView 的容器中,您检查第三个图像数组的第三个元素是 0 还是 1。为什么这里需要字符串?
  • 非常好的方法,我没想到,我正在使用字符串来实现您定义的内容。但是如何实现呢?
  • 我用这种方法添加了另一个答案。
【解决方案4】:

您可以继续使用包含 5 个无符号字符的简单 C 数组,其中数组的索引将指向您的数据。像这样的:

unsigned char nameArray[5] = {0, 0, 0, 0, 0};

// if you want to set the 3rd variable, use:
nameArray[2] = 1;

// to query:
if (nameArray[2]) { ... }

// When you need to save it to NSUserDefaults, wrap it into an NSData:
NSData* nameData = [NSData dataWithBytes:nameArray length:sizeof(nameArray)];
[[NSUserDefaults standardUserDefaults] setObject:nameData forKey:@"myKey"];

// To query it:
NSData* nameData = [[NSUserDefaults standardUserDefaults] dataForKey:@"myKey"];
const unsigned char* nameArray2 = [nameData bytes];
unsigned char second = nameArray2[2];

已编辑:更正数组访问

【讨论】:

  • 为什么要用NSData 包装器包装NSArray?在 pref 中存储 NSArray 非常好。
  • 注意我的代码中的nameArray不是NSArray,只是一个简单的固定大小的无符号字符C数组。另一种解决方案是将整数包装到NSNumbers 中并将它们放入真正的NSArray 中,但在这种情况下,这在我看来开销更大,但这是可以讨论的。
  • 啊,没听懂。喝咖啡时间^_^NSArrays 确实提供了便利,但以降低速度为代价。
  • 感谢 @MrTJ 的帮助,但是在从 nsuserdefaults 查询或取回数组时,我收到此错误:数组初始化程序必须是初始化程序列表或字符串文字。如何解决此错误,无法在网上获取任何信息
  • 嗨,我更正了上面的代码。基本上编译器无法决定编译时C数组的大小,所以它应该被初始化为一个指针。您仍然可以使用 [] 运算符访问指针后面的数组元素,但要特别注意不要使用超出范围的索引(在您的情况下> 4)。
【解决方案5】:

如果最多有五个选项,最简单的方法是使用 if-else-if 链。

NSString *label1 = nil, *label2 = nil, *label3 = nil, *label4 = nil, *label5 = nil; 
for (NSString *s in nameArray) {
    if (label1 == nil)
        label1 = s;
    else if (label2 == nil)
        label2 = s;
    else if (label3 == nil)
        label3 = s;
    else if (label4 == nil)
        label4 = s;
    else if (label5 == nil)
        label5 = s;
}

【讨论】:

    【解决方案6】:
                  NSString *str1=nil;
                  NSString *str2=nil;
                  NSString *str3=nil;
                  NSString *str4=nil;
            for (LocationObject *objLoc in arrLocListFirstView)
                {
                    if (objLoc.isLocSelected)
                    {
                        for (LocationObject *obj in arrLocListFirstView)
                        {
                            if (str1 == nil)
                                str1 = objLoc.strLoc;
                            else if (str2 == nil)
                                str2 = obj.strLoc;
                            else if (str3 == nil)
                                str3 = obj.strLoc;
                            else if (str4 == nil)
                                str4 = obj.strLoc;
                        }
    
        NSString *combined = [NSString stringWithFormat:@"%@,%@,%@,%@", str1,str2,str3,str4];
                        lblLocation.text=combined; (displaying text in UILabel)
                    }
    
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      • 2012-06-17
      • 1970-01-01
      • 2011-02-25
      • 1970-01-01
      相关资源
      最近更新 更多