Вот реализация count
для NSCharacterSet
.Я предполагаю, что внутреннее устройство NSCharacterSet использует bitmapRepresentation
, предоставляемое в API, и что characterIsMember
полагается на это и работает быстро.Вероятно, быстрее выполнять манипуляции с указателями непосредственно над данными bitmapRepresentation
(см. Документацию Apple по последнему методу для проверки членства), но я бы предпочел придерживаться этой читаемой версии.Цикл из 65536 итераций не так уж плох в большинстве ситуаций, и если вы будете часто вызывать его, вы также можете кэшировать возвращаемое значение при работе с неизменным классом.Замените "foobar" своим собственным префиксом, чтобы избежать конфликтов с частной внутренней реализацией count
.
- (NSUInteger)foobar_count
{
NSUInteger count = 0;
for (NSUInteger i = 0; i < 8192 * 16; i ++)
{
if ([self characterIsMember:(unichar)i])
{
count ++;
}
}
return count;
}