Значение типа '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 { ... }
}