如何知道enumerateTags函数何时完成?

时间:2018-10-01 20:10:41

标签: ios swift

我正在使用enumerateTags类的NSLinguisticTagger函数进行一些字符串分析。一切正常,除了以下一种:我永远无法确定枚举何时结束。

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上搜索了很多,但是我找不到这种广泛的任务的任何解决方案:如何确定枚举何时结束?

3 个答案:

答案 0 :(得分:0)

您要删除标点符号和空格,因此如果文本的确以空格或标点结尾,则条件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条件之内。

答案 1 :(得分:0)

enumerateTags(in:unit:scheme:options:using:) 同步枚举字符串的给定范围,并且 调用每个标签的闭包。函数返回时,枚举已完成。

(据我所知)异步方法都是记录的, 以@escaping闭包作为参数,并允许指定某种完成处理程序(或完成委托方法)。

答案 2 :(得分:0)

这是我的解决方法

df[['First_Name','Last_Name']]=df.pop('Names').str.split(" ",expand=True)
print(df)
        Email First_Name Last_Name
0   aa@bb.com         aa        bb
1   bb@cc.com         bb        cc
2   cc@dd.com         cc        dd