2014-01-08 46 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); 
相關問題