2016-06-26 23 views
0

文字列の最初の文字が0であることを確認しています。それを削除して再度チェックするメソッドがある場合は0です。これをデバッグして数字を達成したようです0がなければ、それは後ろに行く。コード:再帰的メソッドObjective-C

-(NSString *)deleteZerosOnFirst:(NSString *)card 
{ 
    NSString *firstLetter = [card substringToIndex:1]; 
    if ([firstLetter isEqualToString:@"0"]) { 
     card = [card substringFromIndex:1]; 
     [self deleteZerosOnFirst:card]; 
     NSLog(@"CARD: %@", card); 
     return card; 
    } 
    else { 
     NSLog(@"CARD: %@", card); 
     return card; 
    } 

} 
+0

は、それがためにループを使用してだけの問題ではないですか?なぜそれを再帰的にする必要がありますか? –

+0

あなたは私にそれをどうやってヒントを教えてもらえますか? 0が最初の文字でないという条件が満たされるまで反復する必要があります。 – Stefan

+0

あなたはどこでも再帰の結果を結合していません。最初の呼び出しの結果は常に元の引数から単一の初期値 '@" 0 "'を引いたものになります。そして、「後方へ」という意味は何ですか? –

答えて

3

はここにあなたの再帰呼び出しです。新しい文字列を作成して返します。あなたは返された文字列を無視しています。あなたはこれをしたい:

card = [self deleteZerosOnFirst:card]; 

しかし、これは本当にずっと簡単です:

@implementation NSString (withoutLeadingZeroes) 

- (NSString *)withoutLeadingZeroes { 
    NSString *s = self; 
    while ([s hasPrefix:@"0"]) { 
     s = [s substringFromIndex:1]; 
    } 
    return s; 
} 

@end 
+0

Rob、あなたの単純化された方法は、あなたが好きな.mファイルに追加することはできますか? –

+0

任意のクラスのメソッドとして、またはフリー関数として実装することができますが、カテゴリとして最も理にかなっています。 –

3

主な問題は、再帰の結果を使用していないことです。あなたがのNSLogを行う前に、あなたはdeleteZerosOnFirstを呼んでいる、また

card = [self deleteZerosOnFirst:card]; 

:あなた自身を呼び出すコード行がこれを言う必要があります。これらの2行の順序を逆にします。それは少なくともあなたのデバッグ出力を正しい順序で与えるでしょう。

[self deleteZerosOnFirst:card]; 

card参照という文字列を変更しません: