2017-08-24 44 views
1

我有文字指示码其工作良好,快捷3,但迁移到SWIFT 4后,我得到了错误类型的值“NSLinguisticTag”没有成员“范围”

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

随着斯威夫特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 { ... } 
} 
相关问题