2012-12-09 2 views
1

환율 계산기 앱을 만들고 있으며 최신 환율 저장 문제가 있습니다. 나는 단추를 사용하여 응용 프로그램 내에서 수동으로 호출 할 수있는 applicationDidUpdateCurrency라는 메서드가 있습니다. 또는 응용 프로그램이 경고에 대해 예를 클릭하여 시작될 때 호출 할 수 있습니다. 메서드는 최신 환율을 가져 와서 배열에 추가합니다. 그런 다음 NSArray 항목을 float 값으로 이동 한 다음 콘솔에 기록한 일련의 명령문을 통해 응용 프로그램 루프를 만듭니다. 모두 잘 작동합니다.메서드 완료 후 부동 소수점 숫자가 값을 유지하지 않음

+(void)applicationDidUpdateCurrency 
{ 
    NSError *error; 

    // Load .csv file. 

    NSString *allStates = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://download.finance.yahoo.com/d/quotes.csv?s=USDUSD=X,CNYUSD=X,GBPUSD=X,EGPUSD=X,CADUSD=X,EURUSD=X,&f=sl1d1t1ban&e=.csv"] encoding:NSUTF8StringEncoding error:&error]; 

    // Remove all quotes from file, replace them with nothing. 

    NSString *strippedPartOne = [allStates stringByReplacingOccurrencesOfString:@"\"" withString:@""]; 

    // Remove excess new lines from the csv file. 

    NSString *strippedPartTwo = [strippedPartOne stringByReplacingOccurrencesOfString:@"\r" withString:@""]; 

    // Add strippedPartTwo to array. 

    NSArray *rows = [strippedPartTwo componentsSeparatedByString:@"\n"]; 


    // NSArray *components; 

    for(int i=0; i<[rows count]; i++) 
    {   
     components = [[rows objectAtIndex:i] componentsSeparatedByString:@","]; 

     // NSLog(@"Conversion: %@ Value: %@", [components objectAtIndex:0], [components objectAtIndex:1]); 


     if ([[rows objectAtIndex:i] isEqualToString:@""]) { 
      continue; 
     } 

     if (i==0) { 
      float floatUSD = 1; 

      NSLog(@"USD2: %f", floatUSD); 
      continue; 
     } 

     if (i==1) { 
      float beforeFloatCNY = [[components objectAtIndex:1] floatValue]; 
      float floatCNY = 1/beforeFloatCNY; 
      NSLog(@"CNY2: %f", floatCNY); 
     } 

     if (i==2) { 
      float beforeFloatGBP = [[components objectAtIndex:1] floatValue]; 
      float floatGBP = 1/beforeFloatGBP; 
      NSLog(@"GBP2: %f", floatGBP); 
     } 

     if (i==3) { 
      float beforeFloatEGP = [[components objectAtIndex:1] floatValue]; 
      float floatEGP = 1/beforeFloatEGP; 
      NSLog(@"EGP2: %f", floatEGP); 
     } 

     if (i==4) { 
      float beforeFloatCAD = [[components objectAtIndex:1] floatValue]; 
      float floatCAD = 1/beforeFloatCAD; 
      NSLog(@"CAD2: %f", floatCAD); 
     } 

     if (i==5) { 
      float beforeFloatEUR = [[components objectAtIndex:1] floatValue]; 
      float floatEUR = 1/beforeFloatEUR; 
      NSLog(@"EUR2: %f", floatEUR); 
     } 



    } 

} 

이 메서드는 통화 목록이있는 테이블 뷰 컨트롤러와 연결된 동일한 파일에 있습니다. 나는 단순히 그 값을 다시 배열에 넣으려고하기 때문에 델리게이트로 주 뷰 컨트롤러로 더 쉽게 되돌려 보낼 수있다.

applicationDidUpdateCurrency 메서드를 호출 한 후 간단한 NSLog (@ "USD2 : % f", floatUSD)가 될 수 없습니다. 해당 값을 다시 표시합니다. 정의 된 직후에 올바르게 로그되지만, 다음 if 문 다음 에라도 0.000000으로 표시됩니다.

이 코드를 사용하여 .h 파일에 floatX 값을 선언합니다.

@property (nonatomic, assign) float floatUSD; 

누구나 나를 도와 줄 수 있습니까? 단순히 float 값을 정의하여 배열에 넣고 테이블보기 컨트롤러에서 항목을 선택하면 주보기 컨트롤러로 다시 보냅니다.

+0

아닌가요'+'클래스 메소드를 지정? 물건을 돌려 줄 필요 없어? –

+0

@ ott - 클래스 메소드에서 객체를 반환하는 것은 의무 사항이 아닙니다. 자동으로 다시 설정된 객체를 생성하는 것은 Cocoa의 일반적인 패턴 일 뿐이지 만 모든 클래스 메소드가 생성자는 아닙니다. C 표준 라이브러리의 모든 함수가' malloc()'... –

+2

통화에 부동 소수점 형식을 사용 하시겠습니까? 본질적으로 고정 된 정밀도를 위해 부동 소수점 데이터 유형을 사용함으로써 도입 된 다양한 근사값 때문에 거의 좋은 아이디어가 아닙니다. –

답변

1

변수와 새로 선언 된 변수 (이제 가장 안쪽 범위에 있음)를 다시 선언하면 인스턴스 변수가 숨겨집니다. (경고가 켜져있는 상태에서 이것을 컴파일한다면 이것에 대한 경고를 얻을 것이다). 너는 필요 없으며, 실제로는 이 아니라을 다시 선언해야한다.

또한 속성 자체에 액세스하고 백업 인스턴스 변수에는 액세스하지 않습니다. 그래서, 전부, 대신

float floatUSD = 1; 

쓰기의

self.floatUSD = 1; 
+0

감사합니다. 그것은 나를 위해 일했다. – William

관련 문제