【问题标题】:if statements, a faster way?if 语句,更快的方法?
【发布时间】:2013-01-11 14:21:31
【问题描述】:

我知道这可以更快,但我没有多年的编码经验,所以我只是在努力学习..

我创建了一个函数,如果不将字符串添加到 nsurl,则检查字符串是否不是 "",然后我检查 nsurl 是否不为零并将其添加到可变数组:

-(void)CheckUrls
{    
self.items = [NSMutableArray array];


NSURL *URL1 ;
NSURL *URL2 ;
NSURL *URL3 ;
NSURL *URL4 ;
NSURL *URL5 ;
NSURL *URL6 ;


NSLog(@" FOTO 1: %@ \n FOTO2 : %@ \n FOTO 3 : %@ \n FOTO 4 : %@ \n FOTO 5: %@ \n FOTO 6: %@ \n",self.searchResult.foto1,self.searchResult.foto2,self.searchResult.foto3,self.searchResult.foto4,self.searchResult.foto5,self.searchResult.foto6);

if (![self.searchResult.foto1 isEqualToString:@""]) {
    URL1 = [NSURL URLWithString:self.searchResult.foto1];

}
if (![self.searchResult.foto2 isEqualToString:@""]) {
    URL2 = [NSURL URLWithString:self.searchResult.foto2];

}
if (![self.searchResult.foto3 isEqualToString:@""]) {
    URL3 = [NSURL URLWithString:self.searchResult.foto3];

}
if (![self.searchResult.foto4 isEqualToString:@""]) {
    URL4 = [NSURL URLWithString:self.searchResult.foto4];

}
if (![self.searchResult.foto5 isEqualToString:@""]) {
    URL5 = [NSURL URLWithString:self.searchResult.foto5];

}
if (![self.searchResult.foto6 isEqualToString:@""]) {
    URL6 = [NSURL URLWithString:self.searchResult.foto6];

}



if (URL1 !=NULL) {
    [items addObject:URL1];
}

if (URL2 !=NULL) {
    [items addObject:URL2];
}
if (URL3 !=NULL) {
    [items addObject:URL3];
}
if (URL4 !=NULL) {
    [items addObject:URL4];
}
if (URL5 !=NULL) {
    [items addObject:URL5];
}
if (URL6 !=NULL) {
    [items addObject:URL6];
}

这个功能可以优化吗?

【问题讨论】:

  • 如果块是一些最快的构造。真的,以不同的方式做只会导致可读性/更少的代码,而不是性能。
  • for循环去array
  • 使用 self.searchResult.foto1.length == 0 代替 isEqualToString:@""
  • 您是否在问是否可以在所需的最少代码量上进行优化或在速度方面进行优化?
  • 你可以合并 2 组 if 语句

标签: objective-c xcode if-statement coding-style


【解决方案1】:
NSArray* photosToCheck = [NSArray arrayWithObjects:
  self.searchResult.foto1, self.searchResult.foto2, self.searchResult.foto3, self.searchResult.foto4, self.searchResult.foto5, self.searchResult.foto6, nil];

for (NSString* photo in photosToCheck) {
    if (photo.length > 0) {
        NSURL* photoUrl = [NSURL URLWithString:photo];
        [items addObject:photoUrl];
    }
}

但是,拥有名为 foto1foto2、... 的属性会立即告诉我们应该使用数组来保存数据。

【讨论】:

  • 这是更好的代码,但速度稍慢(这不是很重要)。
  • @trojanfoe 如果我追求性能,我会使用纯 C :) 然而,这段代码可能是他需要的,尽管他声称不同。
  • 我就是这么写的,完全不用担心性能问题。
  • @Sulthan 因此,对于速度优化来说,它已经足够好了,但对于可读的代码和未来的证明,最好这样做。它还节省了制作 url1、url2 等变量的成本...... tnx !
【解决方案2】:

如果您正好有 6 张照片,请保持原样。
否则使用 URL 数组,并循环遍历它们。

【讨论】:

    【解决方案3】:

    与空字符串比较相当于测试字符串是否为零长度。它不会在 CPU 时间方面节省太多,但至少更易于阅读。你也可以在设置时将 URL 存储在数组中,因此以后无需测试它们:

    if ([self.searchResult.foto1 length] > 0) {
        URL1 = [NSURL URLWithString:self.searchResult.foto1];
        [items addObject:URL1];
    }
    if ([self.searchResult.foto2 length] > 0) {
        URL2 = [NSURL URLWithString:self.searchResult.foto2];
        [items addObject:URL2];
    }
    // etc.
    

    如果您实际上不使用URL1 等,您可以直接将它们放入数组中:

    if ([self.searchResult.foto1 length] > 0) {
        [items addObject:[NSURL URLWithString:self.searchResult.foto1]];
    }
    // etc.
    

    【讨论】:

      【解决方案4】:

      让 self.searchResults 成为一个 NSArray 的字符串,无论你在哪里给照片赋值

      for循环有两种方法

      for(NSInteger x = 0;x<100;x++)
      

      在这种情况下会循环直到条件为假 x 大于 99 或

      for(NSObject *key in anArrayOfObjects)
      

      它将遍历数组中的每个对象

      空值检查总是一个好主意,(NSString *) 将 [NSNull null] 类型转换为空 NSString

      url != (NSString *)[NSNull null]
      

      您不需要中间的 NSURL,因为您已经知道 foto 的值是空还是 null,因此您可以立即将对象作为新的 NSURL 放入项目数组中

      [items addObject:[NSURL URLWithString:url]];
      

      最终代码

      -(void)CheckUrls
      {    
          self.items = [NSMutableArray array];
      
          for(NSString *url in self.searchResult){
              if( url != (NSString *)[NSNull null] && ![url isEqualToString:@""] ){
                  [items addObject:[NSURL URLWithString:url]];
              }
          }
      }
      

      【讨论】:

      • 因为向nil 对象发送消息返回nil,如果url 为nil 或空,则对url.length &gt; 0 的单次检查将返回false,如果它至少有一个则返回true字符(这将要求它是非零)。如果利用 nil 对象的这一方面,代码可以变得更简单、更精简。
      • zubergram 我无法创建一个 self.searchResult 数组,因为它也是一个包含其他数据的服装类
      • 然后在自定义类中添加一个 NSArray
      猜你喜欢
      • 1970-01-01
      • 2017-08-29
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多