Краткий ответ?-enumerateAttribute:inRange:options:usingBlock:
не делает того, о чем вы (или я) изначально думали.
Из названия можно предположить, что только перечисляет диапазоны получателя, которые содержат данный атрибут.Это не вариант.Он всегда перечисляет всю строку .Он вызывает блок для каждого запуска, с которым сталкивается.value
, переданный в блок, устанавливается равным значению данного атрибута для этого прогона.Если текущий прогон не содержит данного атрибута, он передает nil
для value
.
Таким образом, для строки, которая не содержит данный атрибут, он все равно будет запускать блок, ноvalue
всегда будет nil
.Для строки, которая полностью покрыта данным атрибутом (с тем же значением), вы можете ожидать, что блок сработает один раз с value
, равным значению этого атрибута в строке.Для строки, которая частично покрыта данным атрибутом, можно ожидать, что блок будет запускаться несколько раз, иногда с value
из nil
, а иногда с value
, равным значению атрибута.
Надеюсь, это поможет.Мне тоже понадобилось время, чтобы взглянуть на это с правильной стороны.