NSScanner scanFloat возвращает неожиданные результаты - PullRequest
0 голосов
/ 16 апреля 2010

Я пытаюсь построить UIColor из списка значений RGB, разделенных запятыми, который равен «0.45,0.53,0.65», представленного здесь объектом colorConfig ...

NSScanner *scanner = [NSScanner scannerWithString:colorConfig];
[scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"\n, "]];
float red, green, blue;
return [UIColor colorWithRed:[scanner scanFloat:&red] green:[scanner scanFloat:&green] blue:[scanner scanFloat:&blue] alpha:1];

Но мой цвет всегда возвращается черным. Поэтому я записал значения в консоль, и я вижу красный = -1,988804, зеленый = -1,988800, синий = -1,988796

Что я делаю не так?

1 Ответ

3 голосов
/ 16 апреля 2010

Ваша проблема в том, что метод scanFloat: не возвращает число с плавающей запятой. Он возвращает BOOL, который сообщает вам, действительно ли сканер считывает число с плавающей запятой (например, если вы решили выполнить какую-либо проверку вашей строки colorConfig). Вместо этого метод scanFloat: считывает число с плавающей точкой в ​​указанную вами переменную (в данном случае красный, зеленый и синий). Вы читаете мусор, когда регистрируете эти переменные, потому что они находятся в стеке и будут брать любой мусор, поскольку вы их не инициализировали.

Используя то, что у вас есть, это на самом деле должно вернуть цвет и записать, если сканирование было действительным:

NSScanner *scanner = [NSScanner scannerWithString:colorConfig];
[scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"\n, "]];
float red, green, blue;
NSLog(@"Valid red scan: %@", [scanner scanFloat:&red]?@"YES":@"NO");
NSLog(@"Valid green scan: %@", [scanner scanFloat:&green]?@"YES":@"NO");
NSLog(@"Valid blue scan: %@", [scanner scanFloat:&blue]?@"YES":@"NO");
return [UIColor colorWithRed:red green:green blue:blue alpha:1];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...