-7

別の文字列の最初の2文字に1文字の文字列が表示されるかどうかを調べようとしています。文字列を==およびisEqualToStringNSStringメソッドと比較しようとしました。私のコードが一致するものを見つけられない理由を誰かが知っていますか?常に0を返します。文字bは単語の2番目の文字の位置(最初のパラメーター)にあり、文字(2番目のパラメーター)と一致する必要があるため、メソッドが2を返すようにします。

主な方法:

    Finder *f = [[Finder alloc]init];

    int position = [f findLetterLocation : @"abc" : @"b"];
    NSLog(@"using == %d", position);

    int position2 = [f findLetterLocation2 : @"abc" : @"b"];
    NSLog(@"using isEqualToString %d", position);

Finder.m

-(int)findLetterLocation: (NSString*)word : (NSString*)letter{
NSRange MyOneRange = {1, 1};
NSRange MyTwoRange = {2, 1};

NSString *firstCharacter = [[NSString alloc] init];
NSString *secondCharacter = [[NSString alloc] init];

firstCharacter = [word substringWithRange:MyOneRange];
secondCharacter = [word substringWithRange:MyTwoRange];

if(firstCharacter == letter){
    return 1;
}
if(firstCharacter == letter){
    return 2;
}
return 0;
}

findLetterLocation2は上記のメソッドとまったく同じですが、ifステートメントを以下のステートメントに置き換えるだけです。

if([firstCharacter isEqualToString: letter]){
    return 1;
}
if([firstCharacter isEqualToString:  letter]){
    return 2;
}

出力は

2012-12-29 18:14:51.253 test[83101:303] using == 0
2012-12-29 18:14:51.255 test[83101:303] using isEqualToString 0

ありがとう!

4

2 に答える 2

1

メソッドを定義しています-[Finder findLetterLocation::]。このメソッドが最初または2番目の文字である場合は、2番目の引数( "letter")の最初の引数( "word")の1インデックスの場所を返し、それ以外の場合はを返し0ます。この実装はトリックを行います:

-(int)findLetterLocation: (NSString*)word : (NSString*)letter
{
    int res = 0;
    if (word && 
        letter &&
        [letter length] == 1) {
        NSRange range = [word rangeOfString:letter];
        if (range.location < 2) {
            res = range.location + 1;
        }
    }
    return res;
}

このメソッド名は型にはまらないものです。より良いメソッド名は

- (int)locationInString:(NSString *)string ofLetter:(NSString *)letter

さらに良いメソッド名は

- (int)pfx_oneIndexedLocationInFirstTwoCharactersOfString:(NSString *)string ofCharacter:(NSString *)letter

ここで、pfxはプロジェクトのプレフィックスに置き換えられます。


このメソッドの戻り型は。であってはなりませんint。代わりに、またはのいずれNSUIntegerかである必要がありますNSInteger。おそらくNSUInteger、結果は常に01またはであるため2です。

- (NSUInteger)pfx_oneIndexedLocationInFirstTwoCharactersOfString:(NSString *)string ofCharacter:(NSString *)letter

NSStringこのメソッドは、スタンドアロンクラスではなく、カテゴリに含まれている必要がありFinderます。

@interface NSString (Locating)

- (NSUInteger)pfx_oneIndexedLocationInFirstTwoCharactersOfCharacter:(NSString *)character

@end

@implementation NSString (Locating)

- (NSUInteger)pfx_oneIndexedLocationInFirstTwoCharactersOfCharacter:(NSString *)character
{
    int res = 0;
    if (character &&
        [character length] == 1) {
        NSRange range = [word rangeOfString:letter];
        if (range.location < 2) {
            res = range.location + 1;
        }
    }
    return res;
}

@end
于 2012-12-29T07:39:47.503 に答える
0

NSRangeは場所をインデックス0として使用します。取得する文字は文字2と文字3です。

また。NSStringは、同じオブジェクトを使用する場合にのみ==と一致すると思います。

文字列を照合するには、-[NSString isEqualToString:]を使用します

お役に立てば幸い

あなたはでテストすることができます

NSLog(@"First Character = %@", firstCharacter);
于 2012-12-29T07:35:45.880 に答える