我的代码中有这个方法:
- (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];
有时候,错误的是,finalData会以<DMX>255,255,255,255,255</DMX>
之外的其他内容出现,并且当应用程序崩溃时。当finalData不是<DMX>255,255,255,255,255</DMX>
时,我只是想让它完全忽略它并等待一个好的。
我在考虑使用符合此条件的if语句:
<DMX>
且仅包含一个</DMX>
。<DMX>0,0,0,0,0</DMX>
且不超过15个数字 - 在本例中为<DMX>255,255,255,255,255</DMX>
。我该如何做到这一点?
答案 0 :(得分: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提取数组时...它将返回预期数量的元素 - 首先检查,并正常处理错误。
答案 1 :(得分: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);