我有一个
NSData
的实例,其中包含源自 NSAttributedString
的属性文本 (NSTextView
)。我想将属性字符串转换为纯字符串 (NSString
),无需任何格式来进行一些文本分析(在转换时,我无法访问原始 NSTextView 或其 NSTextStorage 实例)。
最好的方法是什么?
编辑:
出于好奇,我检查了以下结果:
[[[self textView] textStorage] words]
这对于进行一些文本分析来说似乎很方便。生成的数组包含 NSSubTextStorage 的实例(下面是单词“Eastern”的示例):
东方{ NSFont = "\"LucidaGrande 11.00 pt. P [] (0x7ffcaae08330) fobj=0x10a8472d0, spc=3.48\""; NSParagraphStyle = "对齐方式 0,行间距 0,段落间距 0,段落间距之前 0,头缩进 0,尾缩进 0, FirstLineHeadIndent 0、LineHeight 0/0、LineHeightMultiple 0、 换行模式 0,制表符 ( 28升, 56升, 84升, 112升,
140升, 168升, 196升, 224升, 252升, 280升,
308升, 336L )、DefaultTabInterval 0、块(空)、列表(空)、 BaseWritingDirection -1,HyphenationFactor 0,TighteningFactor 0.05, 标题级别 0"; }
NSSubTextStorage 可能是一个私有类,因为我找不到它的任何文档。它还保留所有格式。
如果我理解正确的话,你有一个
NSData
,比如说data
,包含一个编码的NSAttributedString
。要反转该过程:
NSAttributedString *nas = [[NSAttributedString alloc] initWithData:data
options:nil
documentAttributes:NULL
error:NULL];
并获取没有属性的纯文本,然后执行以下操作:
NSString *str = [nas string];
更新 Swift 5:
attributedText.string
在 Swift 5 和 macOS 10.0+ 中,
NSAttributedString
有一个名为 string
的属性。 string
有以下声明:
var string: String { get }
接收者的字符内容作为
对象。NSString
Apple 还声明了
string
:
附件字符不会从此属性的值中删除。 [...]
以下 Playground 代码展示了如何使用
NSAttributedString
的 string
属性来检索 NSAttributedString
实例的字符串内容:
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
从 Swift 5.7(或更早版本)开始,新的 AttributedString 结构不再具有
string
属性。下面的代码可以工作,即使看起来很傻。
part.characters.map { String($0) }.joined(separator: "")
稍微扩展一下@Juguang的答案:
extension AttributedString {
func toString() -> String {
return self.characters.map { String($0) }.joined(separator: "")
}
}
用途:
print("Working value = \(workingAttribStrng.toString())")
当前的 Swift(截至 2024 年 12 月,Xcode 16.1,Swift 5.10)不会接受早期的答案,但这似乎工作正常,并且此线程是搜索“Swift AttributedString to plaintext”时首先出现的内容。