2010-06-26 55 views
0

我開發一個iPhone應用程序,我得到的警告在法:傳遞按值參數在消息表達式是未定義

NSNumber *latitudeValue; 
NSNumber *longitudeValue; 

[self obtainLatitude:latitudeValue longitude:longitudeValue]; 

的方法聲明如下:

- (void) obtainLatitude:(NSNumber *)latitudeValue longitude:(NSNumber *)longitudeValue { 

    NSNumberFormatter * f = [[NSNumberFormatter alloc] init]; 
    [f setNumberStyle:NSNumberFormatterDecimalStyle]; 

    latitudeValue = [f numberFromString:[latitude.text stringByReplacingOccurrencesOfString:@"," withString:@"."]]; 
    longitudeValue = [f numberFromString:[longitude.text stringByReplacingOccurrencesOfString:@"," withString:@"."]]; 

    [f release]; 
} 

正如你所看到的,我試圖計算latitudeValuelongitudeValue調用obtainLatitude:longitude:,但我做錯了什麼。

我該如何解決這個錯誤?

回答

5

Elfred的答覆工作,但傳遞通過引用非NSError **參數很少見。一般來說,座標 - 數字值 - 通常最常存儲在結構中的常規舊C類型中,因爲相對而言,NSNumber有相當的開銷(對於其中的幾個人來說沒有什麼大不了的,問題,如果你有幾十,幾百或幾千個座標)。

是這樣的:

struct MyLocation { 
    CGFloat latitude; 
    CGFloat longitude; 
}; 
typedef struct MyLocation MyLocation; 

然後:

- (MyLocation) mapCoordinates { 
    MyLocation parsedLocation; 

    parsedLocation.latitude = ....; 
    parsedLocation.longitude = ....; 

    return parsedLocation; 
} 

喜歡的東西上面會在iPhone /可可程序更典型。

正如Dave指出的那樣,您確實不需要爲此定義自己的類型。使用CLLocationCoordinate2D or CLLocation.

+0

+1或者使用'CLLocationCoordinate2D',它幾乎是一樣的東西(除了使用double而不是float)。 – 2010-06-26 17:21:46

+0

我使用NSNumber來檢查latitude.text是否是一個有效的數字。如果你知道另一種方法來檢查這一點,我會使用它。 – VansFannel 2010-06-26 19:57:30

+0

個人而言,我只使用一個數字格式化程序來轉換爲NSNumber,然後將其轉換爲CLLocationCoordinate2D中使用的標量類型。 – bbum 2010-06-26 23:17:44

2

你確實按值傳遞指針,所以當你重新分配它們時,這隻會在你的方法中生效。一種選擇是做到以下幾點:

- (void) obtainLatitude:(NSNumber **)latitudeValue longitude:(NSNumber **)longitudeValue { 

    NSNumberFormatter * f = [[NSNumberFormatter alloc] init]; 
    [f setNumberStyle:NSNumberFormatterDecimalStyle]; 

    *latitudeValue = [f numberFromString:[latitude.text stringByReplacingOccurrencesOfString:@"," withString:@"."]]; 
    *longitudeValue = [f numberFromString:[longitude.text stringByReplacingOccurrencesOfString:@"," withString:@"."]]; 

    [f release]; 

}

那麼您的通話將如下所示:

NSNumber *latitudeValue; 
NSNumber *longitudeValue; 

[self obtainLatitude:&latitudeValue longitude:&longitudeValue]; 
+0

謝謝。有用。 – VansFannel 2010-06-26 17:04:37

相關問題