2012-07-08 71 views
0

我目前正在從一個sql DB'cachedDist'列設置爲雙精度的信息。然而,當我把它放到我的應用程序中並創建我的數組時,我將它變成了一個字符串,排序顯然會關閉,18.15將在2.15之前。我如何解決在我的代碼中,所以它會將距離排序爲Double而不是String?按雙精度值排序而不是字符串值

在Bar對象中。

NSString *cachedDist 
@property(nonatomic,copy) NSString *cachedDist; 

@synthesize cachedDist; 

我while循環在視圖控制器。

while (sqlite3_step(sqlStatement)==SQLITE_ROW) { 
      Bar * bar = [[Bar alloc] init]; 
      bar.barName = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,1)]; 
      bar.barAddress = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement,2)]; 
      bar.barCity = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 3)]; 
      bar.barState = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 4)]; 
      bar.barZip = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 5)]; 
      bar.barLat = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 8)]; 
      bar.barLong = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 9)]; 

      if (currentLoc == nil) { 
       NSLog(@"current location is nil %@", currentLoc); 
      }else{ 

      CLLocation *barLocation = [[CLLocation alloc] initWithLatitude:[bar.barLat doubleValue] longitude:[bar.barLong doubleValue]]; 
      bar.cachedDist = [NSNumber numberWithDouble:[currentLoc distanceFromLocation: barLocation]/1000]; 

      [thebars addObject:bar]; 

      } 

我的排序

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"cachedDist" ascending:YES]; 
sortedArray = [thebars sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]]; 

return sortedArray; 

回答

0

的NSString有一個方法doubleValue,使這個很簡單:

double cachedDistance = [cachedDistanceString doubleValue]; 

,你可以在自定義的比較使用您的排序,否則使屬性NSNumber或雙重排序更容易。 (我不知道你是怎麼排序?)

編輯:

我重新評估你的代碼,現在看起來我們正在從一個雙去一個字符串轉換爲雙..我們可以砍掉中間人,可以這麼說。

在你@prototype部分中,更改@property:

// @property(nonatomic,copy) NSString *cachedDist; // old way 
@property(nonatomic) double cachedDist; 

然後分配給它這樣的:

bar.cachedDistance = [currentLoc distanceFromLocation: barLocation]/1000; 

,並刪除其創建的距離串線(實際上是隻是一個雙)。

另外,如果你想更面向對象,你可以(?應該)使用的NSNumber對象:

@property(nonatomic,copy) NSNumber *cachedDist; 
... 
bar.cachedDistance = [NSNumber numberWithDouble:[currentLoc distanceFromLocation: barLocation]/1000]; 
+0

我可以改變'bar.cachedDist = distanceString:''到雙distanceDouble = [distanceString的doubleValue ];'和'bar.cachedDist = distanceDouble;'? – user1454340 2012-07-09 01:29:23

+0

我嘗試了這一點,當我嘗試分配'bar.cachedDist = distanceDouble;'我得到一個錯誤'從不兼容的類型雙'指定給NSString' – user1454340 2012-07-09 01:35:26

+0

我編輯包括建議完全刪除NSString部分,NSNumber或者屬性類型爲double。 – 2012-07-09 01:43:44