2014-12-27 1 views
-3

Может кто-то помочь мне преобразовать это в Swift:Как я могу перебирать все шрифты в атрибутной строке?

NSAttributedString *attrString = self.attributedText; 
NSRange rangeAll = NSMakeRange(0, attrString.length); 


// First pass is to check the smallest and largest fontSize so we can prevent changes beyond that. 

__block float smallestFontSize = 250; 
__block float largestFontSize = 4; 

[self.textStorage enumerateAttributesInRange:rangeAll options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired usingBlock: 
^(NSDictionary *attributes, NSRange range, BOOL *stop) { 

    // Iterate over each attribute and look for a Font Size 
    [attributes enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { 
     if ([[key description] isEqualToString:@"NSFont"]) { 
      UIFont *font = obj; 
      float fontSize = font.pointSize + bySize; 
      smallestFontSize = MIN(smallestFontSize, fontSize); 
      largestFontSize = MAX(largestFontSize, fontSize); 
     } 

    }]; 
}]; 

EDIT:

OK решил. Кажется, что компилятор просто пытается разобраться в деталях и показывает всевозможные синтаксические ошибки до тех пор, пока это не произойдет. Также кажется, что переменная attrs на самом деле не NSDictionary, а словарь Swift, поэтому необходимо использовать его как NSDictionary, прежде чем вы сможете использовать enumerateKeysandObjectsUsingBlock, это правильно?

Если есть лучший способ, пожалуйста, дайте мне знать.

var smallestFontSize: CGFloat = 250 
var largestFontSize: CGFloat = 4 

self.textStorage.enumerateAttributesInRange(rangeAll, options: NSAttributedStringEnumerationOptions.LongestEffectiveRangeNotRequired, usingBlock: { 
    attrs, range, stop in 

    FLOG("") 
    let dict = attrs as NSDictionary 

    dict.enumerateKeysAndObjectsUsingBlock { key, obj, stop in 

     if (key.description.isEqual("NSFont")) { 
      let font = obj as UIFont 
      let fontSize = font.pointSize + bySize 
      smallestFontSize = min(smallestFontSize, fontSize); 
      largestFontSize = max(largestFontSize, fontSize); 
     } 
    } 
}) 
+0

У вас есть что-нибудь до сих пор? Любая конкретная ошибка компилятора? – zneak

+0

Вы пробовали этот конвертировать в быстрый? Это не кодирующая платформа конвертирования. Пожалуйста, поставите здесь свои трудности или проблемы. –

+0

Этот вопрос не соответствует теме, потому что речь идет о переводе с одного языка на другой. – brandonscript

ответ

0

Это немного избыточно, чтобы перебирать все записи в словаре, ища ключ. Весь смысл словарей вы можете получить значение для ключа непосредственно:

textStorage.enumerateAttributesInRange(rangeAll, options: .LongestEffectiveRangeNotRequired) { 
    attrs, range, stop in 

    if let font = attrs?["NSFont"] as? UIFont { 
     let fontSize = font.pointSize + bySize 
     smallestFontSize = min(smallestFontSize, fontSize) 
     largestFontSize = max(largestFontSize, fontSize) 
    } 

} 

Как вы отмечаете, attrs уже является Swift словарь так почему бросил его обратно в NSDictionary? Но вам нужно скрывать содержимое, которое вы получаете от него, к чему-то полезному, следовательно, вызов as? UIFont. if let гарантирует, что все дополнительные опции проверены (например, у attrs есть ключ NSFont и что они являются NSFont), тогда вы можете безопасно использовать шрифт внутри блока.

Поиск минимальных/максимальных значений является хорошим использованием уменьшения, например. дана последовательность значений с некоторыми атрибутами вы хотите найти минимум:

let (minVal,maxVal) = reduce(sequence, (250,4)) { 
    (min($0.0,$1.someattr),max($0.1,$1.someattr)) 
} 

, которые вы могли бы адаптироваться к вашему делу (то есть вместо $1.someattr, принесите размер шрифта, а затем использовать его, возвращая в результате мин/макс кортеж из вашего блока). Однако, чтобы сделать это вместо внешнего enumerateAttributesInRange, вам нужно будет указать последовательность атрибутов от textStorage, не знаю, доступно ли это.

Смежные вопросы