如何在 Mac OSX 上更正 NSLinguisticTagger 函数并出现错误“Type 'String' has no member 'tokenType'”(该函数适用于 iOS)?

Posted

技术标签:

【中文标题】如何在 Mac OSX 上更正 NSLinguisticTagger 函数并出现错误“Type \'String\' has no member \'tokenType\'”(该函数适用于 iOS)?【英文标题】:How to correct NSLinguisticTagger function with error "Type 'String' has no member 'tokenType'" on Mac OSX (function works on iOS)?如何在 Mac OSX 上更正 NSLinguisticTagger 函数并出现错误“Type 'String' has no member 'tokenType'”(该函数适用于 iOS)? 【发布时间】:2018-08-09 18:51:44 【问题描述】:

我在 Mac OSX 10.13.6 上使用 Swift 处理自然语言文本,但收到错误“Type 'String' has no member 'tokenType'”。

为简化起见,我删除了代码并使用了 Apple 文档中的代码,结果相同。该代码在 ios 12.0 和 iOS 11.4 上编译得很好,但在 Mac OSX(10.14、10.13 或 10.10)上编译得不好。

import Foundation

struct Wordy 

    func parseWords(text: String) 
        let tagger = NSLinguisticTagger(tagSchemes: [.tokenType], options: 0)
        tagger.string = text

        let range = NSRange(location: 0, length: text.utf16.count)
        let options: NSLinguisticTagger.Options = [.omitPunctuation, .omitWhitespace]
        tagger.enumerateTags(in: range, unit: .word, scheme: .tokenType, options: options)  _, tokenRange, _ in
            let word = (text as NSString).substring(with: tokenRange)
            print(word)
        
    

这就是问题所在。其他一切都编译得很好:

let tagger = NSLinguisticTagger(tagSchemes: [.tokenType], options: 0)

所以我也试过这个:

let tagger = NSLinguisticTagger(tagSchemes: [NSLinguisticTagScheme.tokenType], options: 0)

但仍然得到错误。我究竟做错了什么?

我检查了其他答案,例如Type string has no member swift 其中建议导入 Foundation。我已经在这样做了。其他人建议更改操作系统版本,这就是我关注这一点的原因。

我正在使用 Xcode 10.5(beta),但在使用 Xcode 9.4.1 时也出现错误。我的 mac 只使用英语,如果这很重要的话。

【问题讨论】:

【参考方案1】:

您的问题出在enumerateTags(in:, unit:, scheme:, options:),因为它可以从 IOS 11 获得,请参阅此处Docs

import Foundation

struct Wordy 

    func parseWords(text: String) 
        let tagger = NSLinguisticTagger(tagSchemes: [.tokenType], options: 0)
        tagger.string = text

        let range = NSRange(location: 0, length: text.utf16.count)
        let options: NSLinguisticTagger.Options = [.omitPunctuation, .omitWhitespace]
        if #available(iOS 11.0, *) 
            tagger.enumerateTags(in: range, unit: .word, scheme: .tokenType, options: options)  _, tokenRange, _ in
                let word = (text as NSString).substring(with: tokenRange)
                print(word)
            
         else 
            // Fallback on earlier versions

            tagger.enumerateTags(in: range, scheme: .tokenType, options: options)  (tag, tokenRange, sentenceRange, stop) in
                let word = (text as NSString).substring(with: tokenRange)
                print(word)

             
        
    

【讨论】:

我很遗憾地报告,进行更改后我仍然遇到问题。我的部署目标是 macOS 10.13。还有什么我可以尝试的吗?我做错什么了?在定义标记器的行上发生了相同的错误。 @Marcy 除了此答案中指出的问题外,我无法重现任何问题。你能发布一个示例项目吗? 我已将项目放在这里github.com/PepperoniJoe/Wordy 一点背景知识,该项目是Exercism.IO 使用TDD 进行的练习。所以我不是 100% 清楚为什么这个项目是这样设置的。但我过去对他们的练习没有任何问题。 Matt 和 Sh_Khan 感谢您的意见,因为它促使我​​更仔细地检查项目设置。该项目将项目格式设置为 Xcode 3.2 兼容性,并且在构建设置中将 Swift 语言版本设置为 Swift 3。将其更改为当前版本解决了该错误。

以上是关于如何在 Mac OSX 上更正 NSLinguisticTagger 函数并出现错误“Type 'String' has no member 'tokenType'”(该函数适用于 iOS)?的主要内容,如果未能解决你的问题,请参考以下文章

sh 如何在Mac OSX上安装和编译rsync

如何在 Mac OSX 上模拟游戏手柄

如何在 mac osx 上使用 msg_nosignal

如何在 Mac OSX 上使用 JDK 7?

如何在 MAC OSX 上获取 NIB 文件的资源

如何在我的 Arduino Uno (Mac OSX) 上保持串行地址一致?