2011-07-16 33 views

Trả lời

6

EDIT:

@fluidsonic là đúng rằng mã ban đầu là không chính xác. Dưới đây là một phiên bản cập nhật trong Swift, thay thế văn bản trong mỗi phạm vi thuộc tính với một phiên bản trên của chuỗi trong phạm vi đó.

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 
    } 
} 

Original câu trả lời:

- (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; 
} 

Điều này không:

  1. Làm cho một bản sao có thể thay đổi của chuỗi đầu vào do.
  2. Đưa tất cả các thuộc tính từ chuỗi đó và đặt chúng vào một mảng để chúng có thể được sử dụng sau này.
  3. Tạo chuỗi chữ hoa thường bằng phương pháp được xây dựng trong phương pháp NSString.
  4. Áp dụng lại tất cả các thuộc tính.

+0

Cảm ơn cho các giải pháp. – AmitSri

+0

Bạn được chào đón. – spudwaffle

+2

Mã không chính xác. Nó có thể tạo ra các chuỗi được phân bổ trong đó các thuộc tính bị tắt bởi một vài ký tự và thậm chí nó có thể sụp đổ. Cách tiếp cận này phụ thuộc vào chuỗi ban đầu và chuỗi trên có cùng số ký tự. Nhưng theo [tài liệu] (https://developer.apple.com/reference/foundation/nsstring/1409855-uppercased) "Biến đổi trường hợp không được đảm bảo đối xứng hoặc để tạo ra các chuỗi có cùng độ dài như bản gốc. ". – fluidsonic

Các vấn đề liên quan