0

この次のコードが意味することは、TextField に数字以外の文字を入力しないようにすることです。しかし、この関数の背後で実際に何が起こっているのでしょうかrangeOfCharacterFromSetそれが返すもの。

if ([string rangeOfCharacterFromSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]].location != NSNotFound)
        return NO;

ドキュメントでそれは言った

指定された文字セットの最初の文字のレシーバー内の範囲を検索して返します。aSet から見つかった最初の文字の受信側の範囲。aSet 内の文字が見つからない場合、{NSNotFound, 0} の範囲を返します

レシーバーとは何か、そしてなぜNSNotFoundがここで使用されているのかさえ理解できません。そして、そのaSetは何ですか

理解を深めるために例を挙げて説明してください(数字以外の文字を押すとどうなるかなど)

4

3 に答える 3

2
- (void)test {
NSString *str = @"input content";
NSCharacterSet *characterSet = [NSCharacterSet decimalDigitCharacterSet];
NSRange range = [str rangeOfCharacterFromSet:characterSet];
NSLog(@"location:%ld, length:%ld", range.location, range.length);
// range.location is 9223372036854775807, in fact it is a NSNotFound which means not exists, range.length is 0

str = @"input 1";
range = [str rangeOfCharacterFromSet:characterSet];
NSLog(@"location:%ld, length:%ld", range.location, range.length);
// range.location is 6, range.length is 1

str = @"input 123";
range = [str rangeOfCharacterFromSet:characterSet];
NSLog(@"location:%ld, length:%ld", range.location, range.length);
// range.location is 6, range.length is 1

str = @"123 input 123";
range = [str rangeOfCharacterFromSet:characterSet];
NSLog(@"location:%ld, length:%ld", range.location, range.length);
// range.location is 0, range.length is 1
}

テストでは、str はレシーバーであり、メソッドを呼び出すとき、誰がレシーバーであるかを呼び出します: [receiver callTheMethod]。NSCharacterSetについては、ドキュメントが明確に説明していると思います:

NSCharacterSet オブジェクトは、Unicode 準拠の文字のセットを表します。NSString および NSScanner オブジェクトは NSCharacterSet オブジェクトを使用して、検索操作のために文字をグループ化します。これにより、検索中に特定の文字セットを見つけることができます。クラスタの 2 つのパブリック クラスである NSCharacterSet と NSMutableCharacterSet は、それぞれ静的および動的文字セットのプログラム インターフェイスを宣言します。

NSRange は [str rangeOfCharacterFromSet:characterSet] の結果であり、構造体です。range.location は、characterSet に含まれる str の最初のインデックスです。これは NSInteger タイプです。str が文字セットの内容を終了しない場合は、非常に大きな整数であり、NSNotFound を意味します。range.length は言葉の通り、ここでは range.location が NSNotFound でない限り常に 1 であることを意味します。

それが役に立てば幸い。

于 2016-06-24T10:22:02.983 に答える
2

そうですね、次の言葉で言いましょう。レシーバーが何かを知らない場合は、Objective-C に関する初心者向けの本を読む必要があります。

しかし、…</p>

受信者はオブジェクトであり、メッセージの送信先です。したがって、もう少し理解しやすくします。

NSCharacterSet *digits = [NSCharacterSet decimalDigitCharacterSet];
[string rangeOfCharacterFromSet:digits];

最初の行で、メッセージdecimalDigitCharacterSetを のクラス オブジェクトに送信しますNSCharacterSet。2 行目では、メッセージrangeOfCharacterFromSet:digitsを のインスタンス オブジェクトに送信しますNSString

それでは、ドキュメントを翻訳しましょう、ステップ 1:

指定された文字セットの最初の文字の文字列 (以前はレシーバー) 内の範囲を検索して返します。aSet から見つかった最初の文字の受信側の範囲。aSet 内の文字が見つからない場合、{NSNotFound, 0} の範囲を返します

nil範囲には 2 つの単純な整数が含まれているため、それらに代入してエラーをマークすることはできません。0 になります。したがって、マジック ナンバー ( NSNotFound) が割り当てられます。ただし、これは気にせず、0 の長さを確認してください。

セットは文字セットであり、数字を含むセットです。

于 2016-06-24T10:30:05.023 に答える
0

NOコードが行うことは、文字列に数字ではない文字が含まれている場合に返されることです。

を呼び出す場合[myString rangeOfCharacterFromSet:mySet]myStringは でreceivermySetaSetです。

NSNotFoundセット内の文字が見つからないことを示す任意の定数です。

于 2016-06-24T09:43:51.180 に答える