我正在使用 NSLinguisticTagger
类的 enumerateTags
函数进行一些字符串分析。一切正常,除了一个:我永远无法确定枚举何时结束。
let originalText = "Some text."
let options: NSLinguisticTagger.Options = [.omitWhitespace, .omitPunctuation]
let schemes = NSLinguisticTagger.availableTagSchemes(forLanguage:"en")
let tagger = NSLinguisticTagger(tagSchemes: schemes, options:Int(options.rawValue))
tagger.string = originalText
tagger.enumerateTags(in: NSMakeRange(0, (originalText as NSString).length),
scheme: NSLinguisticTagScheme.tokenType, options: options) { (tag, tokenRange, _, stop) in
// I do my job here
// I need to callback when the enumeration is over
if tokenRange.upperBound == originalText.count {
// Callback
}
})
当原始字符串以字母结尾时,此结束检查工作正常,但如果它以标点符号或空格结尾,如上例所示,则永远不会调用回调。
我在 google 上搜索了很多,但我认为找不到这个广泛传播的任务的任何解决方案:如何确定枚举何时结束?
最佳答案
您要删除标点符号和空格,因此如果文本确实以空格或标点符号结尾,则条件 if tokenRange.upperBound == originalText.count
永远不会为真。
您可以在语言标注器中使用此字符串而不是 originalText
:
let newText = originalText
.trimmingCharacters(in: .whitespacesAndNewlines)
.trimmingCharacters(in: .punctuationCharacters)
您的代码如下所示:
let originalText = "Some text "
let newText = originalText
.trimmingCharacters(in: .whitespacesAndNewlines)
.trimmingCharacters(in: .punctuationCharacters)
let options: NSLinguisticTagger.Options = [.omitWhitespace, .omitPunctuation]
let schemes = NSLinguisticTagger.availableTagSchemes(forLanguage:"en")
let tagger = NSLinguisticTagger(tagSchemes: schemes, options:Int(options.rawValue))
tagger.string = originalText
tagger.enumerateTags(in: NSMakeRange(0, (newText as NSString).length), scheme: .tokenType, options: options, using: {(tag, tokenRange, _, stop) in
if tokenRange.upperBound == newText.count {
print("reached the end")
}
})
回调以代码中的 in
开始,而不是在 if 条件中。
关于ios - 如何知道 enumerateTags 函数何时完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52598209/