“NSLinguisticTag”类型的值没有成员“范围”

时间:2017-08-24 07:36:36

标签: swift swift4 nslinguistictagger

我的文本方向代码与swift 3一起运行良好但是在迁移到swift 4后,我收到了错误

let tagScheme = [NSLinguisticTagScheme.language]
    let tagger    = NSLinguisticTagger(tagSchemes: tagScheme, options: 0)
    tagger.string = self.text
    let lang      = tagger.tag(at: 0, scheme: NSLinguisticTagScheme.language,
                                      tokenRange: nil, sentenceRange: nil)

    if lang?.range(of: "he") != nil ||  lang?.range(of: "ar") != nil { //Value of type 'NSLinguisticTag' has no member 'range' 
        self.textAlignment = NSTextAlignment.right
    } else {
        self.textAlignment = NSTextAlignment.left
    }

任何人都知道如何解决这个问题?感谢

1 个答案:

答案 0 :(得分:3)

从Swift 4开始,NSLinguisticTagger不返回标签(可选) 字符串,但作为NSLinguisticTag的(可选)值:

public struct NSLinguisticTag : RawRepresentable, Equatable, Hashable {
    public init(_ rawValue: String)
    public init(rawValue: String)
}

您将获得具有rawValue属性的基础字符串:

 if let lang = tagger.tag(at: 0, scheme: .language, tokenRange: nil, sentenceRange: nil) {
    print(lang.rawValue)
    if lang.rawValue.hasPrefix("he") { ... }
}

如果你想检查是否相等而不是遏制那么 您还可以定义自己的NSLinguisticTag常量:

extension NSLinguisticTag {
    static let hebrew = NSLinguisticTag("he")
}

并将其用作

if let lang = tagger.tag(at: 0, scheme: .language, tokenRange: nil, sentenceRange: nil) {
    if lang == .hebrew { ... }
}

另一种选择是定义自定义计算属性

extension NSLinguisticTag {
    var isRightToLeft: Bool {
        return rawValue.hasPrefix("he") || rawValue.hasPrefix("ar")
    }
}

并将其用作

if let lang = tagger.tag(at: 0, scheme: .language, tokenRange: nil, sentenceRange: nil) {
    if lang.isRightToLeft { ... }
}