Значение типа 'NSLinguisticTag' не имеет члена 'range'

У меня есть код направления текста, он работает хорошо с 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 ответ

Решение

Начиная с 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 { ... }
}
Другие вопросы по тегам