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

Posted

技术标签:

【中文标题】“NSLinguisticTag”类型的值没有成员“范围”【英文标题】:Value of type 'NSLinguisticTag' has no member 'range' 【发布时间】:2018-02-01 23:33:13 【问题描述】:

我有文本方向代码,它在 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  ... 

【讨论】:

以上是关于“NSLinguisticTag”类型的值没有成员“范围”的主要内容,如果未能解决你的问题,请参考以下文章

“任何”的值类型没有成员 'objectforKey' Swift 3 转换

Swift 3 - 'Any?' 类型的值没有成员“valueForKey”

“String”类型的值没有成员“stringByAppendingPathComponent”[重复]

“AnyObject”类型的值没有成员年龄

Xcode 13:`'NSPersistentCloudKitContainerOptions' 类型的值没有成员'databaseScope'`

无法弄清楚“ViewController”类型的值没有成员“averageIsAbove”