web-dev-qa-db-ja.com

NSAttributedStringをプレーンテキストに変換する

NSDataに由来する属性付きテキスト(NSAttributedString)を含むNSTextViewのインスタンスがあります。何らかのテキスト分析を行うために、書式設定なしで属性付き文字列をプレーン文字列(NSString)に変換したい(変換の時点では、元のNSTextViewまたはそのNSTextStorageインスタンスにアクセスできない)。

これを行う最善の方法は何でしょうか?

編集:

好奇心から、私は次の結果を調べました:

[[[self textView] textStorage] words]

これは、テキスト分析を行うのに便利なもののようです。結果の配列には、NSSubTextStorageのインスタンスが含まれます(Wordの「Eastern」の下の例):

東部{NSFont = "\" LucidaGrande 11.00 pt。 P [](0x7ffcaae08330)fobj = 0x10a8472d0、spc = 3.48\""; NSParagraphStyle = "Alignment 0、LineSpacing 0、ParagraphSpacing 0、ParagraphSpacingBefore 0、HeadIndent 0、TailIndent 0、FirstLineHeadIndent 0、LineHeight 0/0、LineHeightMultiple 0、LineBreakMode 0、Tabs(\ n 28L、\ n 56L、\ n 84L、\ n 112L、\ n
140L、\ n 168L、\ n 196L、\ n 224L、\ n 252L、\ n 280L、\ n
308L、\ n 336L\n)、DefaultTabInterval 0、ブロック(null)、リスト(null)、BaseWritingDirection -1、HyphenationFactor 0、TighteningFactor 0.05、HeaderLevel 0 ";}

NSSubTextStorageは、ドキュメントが見つからなかったため、おそらくプライベートクラスです。また、すべてのフォーマットが保持されます。

35
Roger

正しく理解できれば、エンコードされたNSDataを含むdata、たとえばNSAttributedStringを使用できます。プロセスを逆にするには:

NSAttributedString *nas = [[NSAttributedString alloc] initWithData:data
                                                           options:nil
                                                documentAttributes:NULL
                                                             error:NULL];

そして、属性なしのプレーンテキストを取得するには、次のようにします。

NSString *str = [nas string];
62
CRD

Swift 5の更新:

attributedText.string
14
Justin Vallely

Swift 5およびmacOS 10.0+の場合、NSAttributedStringには string というプロパティがあります。stringには次のものが含まれます宣言:

var string: String { get }

NSStringオブジェクトとしてのレシーバーの文字コンテンツ。

Appleはstringについても述べています:

添付文字は、このプロパティの値から削除されません。 [...]


次のPlaygroundコードは、NSAttributedStringインスタンスの文字列コンテンツを取得するためにstringNSAttributedStringプロパティを使用する方法を示しています。

import Cocoa

let string = "Some text"
let attributes = [NSAttributedString.Key.underlineStyle : NSUnderlineStyle.single]
let attributedString = NSAttributedString(string: string, attributes: attributes)

/* later */

let newString = attributedString.string
print(newString) // prints: "Some text"
print(type(of: newString)) // prints: String
3
Imanou Petit