2014-01-08 34 views
2

首先,我很抱歉的问题标题。而不是开关盒,更有效地选择字符串

现在,问题: 我正在写一个iPhone应用程序,该应用程序读取指南针值并显示设备正面对的方向名称。至于撰写,我这样做:

switch (trueHeadingRounded) { 
    case 23 ... 68: 
     cardinalDirection = @"northeast"; 
     break; 
    case 69 ... 114: 
     cardinalDirection = @"east"; 
     break; 
    //ad infinitum 

我该如何缩短这部分?一定有更好的方法。

回答

5

你可以做到以下几点:

  1. 创建一个算术功能,让您根据角度的数字。该数字将介于0和7之间(东北为0,东为1,依此类推)。看起来像(x - 23)/45或类似的东西。
  2. 然后创建一个映射数组,为您提供数字方向的名称。 [0] => 'Northeast', [1] => 'East', etc.
  3. 在数组中查找要返回的名称。 return mappingArray[indexFromAngle(x)]
3

不要编写代码来缩短它,编写代码使其更容易理解。清晰就是一切。

如果出于清晰考虑对性能编写有所担忧,那么如果存在性能问题配置文件以准确查找哪些内容以及在哪里然后解决该问题。

+0

好点。我评论了我的所有代码,所以可理解性不是问题(我希望)。我只是不喜欢在我的项目中有大约30行代码,最多可以缩短到4行。 –

0

您可以使用类似:

cardinalDirection = (trueHeadingRounded <= 22 ? @"north" : 
         trueHeadingRounded <= 68 ? @"northeast" : 
         treuHeadingRounded <= 114 ? @"east" : 

不过,我想我会使用映射阵列建议。

1
NSString* cardinalDirection = @[@"north", @"northeast", @"east", @"southeast", @"south", @"southwest", @"west", @"northwest", @"north"][(trueHeadingRounded + 23)/45]; 

这可能是我对23常数或某些这样的 - 我没有仔细检查过我的计算。 (但我有点赞同Zaph。)

(当然,如果你确实这样做了,为了效率的缘故,使数组成为相对常量内部类属性或某些类型可能是明智的。 )

1

您可以通过使用命名的常量,而不是幻数

typedef NS_ENUM(NSInteger, Heading) { 
    HeadingNorth = -1, 
    HeadingNorthEast, 
    HeadingEast, 
    HeadingSouthEast, 
    HeadingSouth, 
    HeadingSouthWest, 
    HeadingWest, 
    HeadingNorthWest 
}; 

增加可读性你可以比改变你的switch语句

Heading heading = floor((trueHeadingRounded - 23)/45); 

NSString *cardinalDirection; 

switch (heading) { 
    case HeadingNorth:  cardinalDirection = @"north";  break; 
    case HeadingNorthEast: cardinalDirection = @"northeast"; break; 
    case HeadingEast:  cardinalDirection = @"east";  break; 
    case HeadingSouthEast: cardinalDirection = @"southeast"; break; 
    case HeadingSouth:  cardinalDirection = @"south";  break; 
    case HeadingSouthWest: cardinalDirection = @"southwest"; break; 
    case HeadingWest:  cardinalDirection = @"west";  break; 
    case HeadingNorthWest: cardinalDirection = @"northwest"; break; 
} 
NSLog(@"%@", cardinalDirection); 
相关问题