2011-07-16 17 views

cevap

6

DÜZENLEME:

@fluidsonic orijinal kod yanlış olduğunu doğru mu. Aşağıda, Swift'de, her bir özellik aralığındaki metni, bu aralıktaki dizenin genişletilmiş bir sürümüyle değiştiren güncellenmiş bir sürüm bulunmaktadır.

extension NSAttributedString { 
    func uppercased() -> NSAttributedString { 

     let result = NSMutableAttributedString(attributedString: self) 

     result.enumerateAttributes(in: NSRange(location: 0, length: length), options: []) {_, range, _ in 
      result.replaceCharacters(in: range, with: (string as NSString).substring(with: range).uppercased()) 
     } 

     return result 
    } 
} 

Orjinal cevap: Bu ne yapar

- (NSAttributedString *)upperCaseAttributedStringFromAttributedString:(NSAttributedString *)inAttrString { 
    // Make a mutable copy of your input string 
    NSMutableAttributedString *attrString = [inAttrString mutableCopy]; 

    // Make an array to save the attributes in 
    NSMutableArray *attributes = [NSMutableArray array]; 

    // Add each set of attributes to the array in a dictionary containing the attributes and range 
    [attrString enumerateAttributesInRange:NSMakeRange(0, [attrString length]) options:0 usingBlock:^(NSDictionary *attrs, NSRange range, BOOL *stop) { 
     [attributes addObject:@{@"attrs":attrs, @"range":[NSValue valueWithRange:range]}]; 
    }]; 

    // Make a plain uppercase string 
    NSString *string = [[attrString string]uppercaseString]; 

    // Replace the characters with the uppercase ones 
    [attrString replaceCharactersInRange:NSMakeRange(0, [attrString length]) withString:string]; 

    // Reapply each attribute 
    for (NSDictionary *attribute in attributes) { 
     [attrString setAttributes:attribute[@"attrs"] range:[attribute[@"range"] rangeValue]]; 
    } 

    return attrString; 
} 

:

  1. giriş atfedilen bir ip değişken kopyasını yapar.
  2. Tüm öznitelikleri bu dizeden alır ve daha sonra kullanabilmeleri için bunları bir diziye koyar.
  3. Dahili NSString yöntemini kullanarak büyük harfli düz bir dize yapar.
  4. Tüm nitelikleri tekrar uygular. çözüm için

+0

teşekkürler. – AmitSri

+0

Rica ederim. – spudwaffle

+2

Kod doğru değil. Özniteliklerin birkaç karakter tarafından kapalı olduğu atfedilen dizeleri üretebilir ve hatta çökebilir. Yaklaşım, başlangıç ​​dizisine ve aynı sayıda karaktere sahip olan büyük harfli dizeye bağlıdır. Ancak [belgeler] 'e göre (https://developer.apple.com/reference/foundation/nsstring/1409855-uppercased) "Vaka dönüşümlerinin simetrik olması ya da orijinallerle aynı uzunluktaki dizileri üretmesi garanti edilmez. ". – fluidsonic