0

私のコードにはこのメソッドがあります:

- (void) fullDMXReceived:(NSString*)finalData {

これは、の完全な行が<DMX>255,255,255,255,255</DMX>入り、その行が「finalData」に格納されたときに呼び出されます。

'finalData'がパーサーに送信する前に正しくフォーマットされているかどうかを判断するためのコードが必要です。

NSArray* allIncomingParseDMX1 = [finalData componentsSeparatedByString:@"<DMX>"];
NSString *parseDMXString1 = [allIncomingParseDMX1 objectAtIndex:1];

NSArray* allIncomingParseDMX2 = [parseDMXString1 componentsSeparatedByString:@"</DMX>"];
NSString *parseDMXString2 = [allIncomingParseDMX2 objectAtIndex:0];

NSArray* allIncoming = [parseDMXString2 componentsSeparatedByString:@","];

[redSlider setStringValue:[allIncoming objectAtIndex:0]];
[greenSlider setStringValue:[allIncoming objectAtIndex:1]];
[blueSlider setStringValue:[allIncoming objectAtIndex:2]];
[strobeSlider setStringValue:[allIncoming objectAtIndex:3]];
[strobeRandomSlider setStringValue:[allIncoming objectAtIndex:4]];
[self controlChange];

<DMX>255,255,255,255,255</DMX>時々、エラーで、finalDataは、アプリがクラッシュする以外の何かとして入ってくることがあります。finalDataがそうでない場合、私は<DMX>255,255,255,255,255</DMX>それを完全に無視して、良いものを待つだけです。

私はこの基準に一致するifステートメントを持つことを考えていました:

  1. <DMX>文字列には、1つと1つだけが含まれます</DMX>
  2. 文字列には正確に4つの"、"が含まれます
  3. 文字列には、この場合のように少なくとも5つの数字が含まれ、この場合<DMX>0,0,0,0,0</DMX>のように15以下の数字が含まれ<DMX>255,255,255,255,255</DMX>ます。

どうすればこれを達成できますか?

4

2 に答える 2

1

この状況では、私は通常、妥当性チェックを実行するための専用の方法をいくつか持っています。

このメソッドには、考えられる限り多くのチェックを追加し、必要に応じて新しいチェックを追加できます。

finalDataを反復処理し、各行の有効性をテストし、有効な場合にのみスライダー値を抽出します。

あなたの場合、簡単な最初のチェックは

- (BOOL) validityCheck:(NSString *) testString
{
    if (!testString)
    {
        // Received nil as a parameter, so just bail here.

        return NO;
    }

    BOOL valid = YES;

    // Look for reasons string may be invalid...

    // Check for expected prefix / suffix...

    if (![testString hasPrefix:@"<DMX>"] || ![testString hasSuffix:@"</DMX>"])
    {
        valid = NO;
    }

    // Check number of elements is in valid range...

    int numOfElements = [testString count];

    if (numOfElements >= 5 && numOfElements <= 15)
    {
        valid = NO;
    }

    // Add more tests for validity...

    // And eventually, return the result...

    return valid;
}

これらの手法のいくつかは、一般的にコードに追加する必要があります。これは、不正な形式の入力を検出するだけでなく、これらの状況でコードがクラッシュしないようにするためです。たとえば、coponentsSeparatedBy ...を使用して配列を抽出するときに、予想される数の要素が返されると想定しないでください。最初に確認し、エラーを適切に処理してください。

于 2012-12-09T14:59:24.083 に答える
1

NSRegularExpressionを調べる必要があります。そしてRegular Expression、あなたの文字列を一致させるために使用します。

//Generate the RegularExpression: <DMX>((?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\,){4}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))</DMX>
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"<DMX>((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\,){4}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))</DMX>"
                                                                       options:NSRegularExpressionCaseInsensitive
                                                                         error:&error];
//Our test strings
NSString *stringMatch = @"<DMX>255,255,255,255,255</DMX>";
NSString *stringNotMatch = @"<DMX>255,255,255,255,299</DMX>";
NSString *stringNotMatch2 = @"<DMX>0,0,0,0</DMX>";


//Get numberOfMatchesInString
NSUInteger resultA = [regex numberOfMatchesInString:stringMatch
                                            options:0
                                              range:NSMakeRange(0, [stringMatch length])];

NSUInteger resultB = [regex numberOfMatchesInString:stringNotMatch
                                            options:0
                                              range:NSMakeRange(0, [stringNotMatch length])];

NSUInteger resultC = [regex numberOfMatchesInString:stringNotMatch2
                                            options:0
                                              range:NSMakeRange(0, [stringNotMatch2 length])];

//resultA should be 1. resultB should be 0. resultC should be 0.
NSLog(@"ResultA:%d",resultA);
NSLog(@"ResultB:%d",resultB);
NSLog(@"ResultC:%d",resultC);
于 2012-12-09T15:12:57.140 に答える