web-dev-qa-db-ja.com

タイプ 'Range <String.Index>'(別名 'Range <String.CharacterView.Index>')の値を予期される引数タイプ 'NSRange'(別名 '_NSRange')に変換できません

部分文字列を属性付き文字列に置き換えようとしています。以下は私のコードです。

let searchText = self.searchBar.text!
let name = item.firstName ?? ""
let idNo = "Employee Id. \(item.employeeId ?? "NA")"

if let range = name.range(of: searchText, options: String.CompareOptions.caseInsensitive, range: nil, locale: nil)
{
    let attributedSubString = NSAttributedString.init(string: name.substring(with: range), attributes: [NSFontAttributeName : UIFont.boldSystemFont(ofSize: 17)])
    let normalNameString = NSMutableAttributedString.init(string: name)
    normalNameString.mutableString.replacingCharacters(in: range, with: attributedSubString)
    cell.name.attributedText = normalNameString
}
else
{
    cell.name.text = name
}

コンパイル時エラーが発生します:

「タイプ 'Range'(別名 'Range')の値を予期される引数タイプ 'NSRange'(別名 '_NSRange')に変換できません。」.

ここで何を変更すればよいですか?

12
Bharath Reddy

NSStringNSRangeを使用できます。また、この行を変更する必要がありますnormalNameString.mutableString.replacingCharacters(in: range, with: attributedSubString)代わりにこの行を使用しますnormalNameString.replaceCharacters(in: nsRange, with: attributedSubString) mutableStringはNSMutableStringであり、replacingCharactersNSAttributtedStringではなく文字列を期待するため

完全なコード

    let nsRange = NSString(string: name).range(of: searchText, options: String.CompareOptions.caseInsensitive)

    if nsRange.location != NSNotFound
    {
        let attributedSubString = NSAttributedString.init(string: NSString(string: name).substring(with: nsRange), attributes: [NSFontAttributeName : UIFont.boldSystemFont(ofSize: 17)])
        let normalNameString = NSMutableAttributedString.init(string: name)
        normalNameString.replaceCharacters(in: nsRange, with: attributedSubString)
        cell.name.attributedText = normalNameString
    }
    else
    {
        cell.name.text = name
    }
8
Reinier Melian

以下のようにRange<String.index>NSRangelowerBoundの位置の値を使用してUpperBoundインスタンスを作成する必要があります。

let searchText = "Kiran"
let name = "Kiran Jasvanee"
let idNo = "Employee Id. \("24")"

if let range = name.range(of: searchText, options: String.CompareOptions.caseInsensitive, range: nil, locale: nil)
{
    let attributedSubString = NSAttributedString.init(string: name.substring(with: range), attributes: [NSFontAttributeName : UIFont.boldSystemFont(ofSize: 17)])
    let normalNameString = NSMutableAttributedString.init(string: name)

    let startPos = name.distance(from: searchText.characters.startIndex, to: range.lowerBound)
    let nsrange = NSMakeRange(startPos, searchText.characters.count)

    normalNameString.replaceCharacters(in: nsrange, with: attributedSubString)
    labelName.attributedText = normalNameString
}
else
{
    labelName.text = name
}  

追加、self.searchBar.text!の代わりに"Kiran"searchtext constantに追加および
要件に応じて、item.firstName ?? """Kiran Jasvanee"ではなくname constantを追加します。

私はそれをデモで試しました、そして私が投稿したコードは以下のようにうまくいきます。チェックしてください。
enter image description here

name = "AKiranJasvanee"の場合
enter image description here
場合name = "KiranJasvanee"
enter image description here

2
Kiran Jasvanee

そのようにしてください、

最初、

extension String {

    func nsRange(from range: Range<String.Index>) -> NSRange {
        let from = range.lowerBound.samePosition(in: utf16)
        let to = range.upperBound.samePosition(in: utf16)
        return NSRange(location: utf16.distance(from: utf16.startIndex, to: from),
                       length: utf16.distance(from: from, to: to))
    }
}

その後、そのようなラベルと文字列が1つあります。

private func setAttributedLabel() {

    let lableText = UILabel()

    let strTitle = "Basic string Double tap" // your main string
    let title:NSMutableAttributedString = NSMutableAttributedString(string: strTitle)

    // give attribute to basic string
    title.addAttributes([NSForegroundColorAttributeName:UIColor.blue ,NSFontAttributeName:UIFont.boldSystemFont(ofSize: 15)], range: NSRange.init(location: 0, length: title.length))
    lableText.attributedText = title

    // give attribute to your range string
    let rangeOfString = lableText.text?.range(of: "Double tap") // this string is subString of strTitle
    title.addAttributes([NSForegroundColorAttributeName:UIColor.gray,NSFontAttributeName:UIFont.systemFont(ofSize: 15)], range: strTitle.nsRange(from: rangeOfString!))
    lableText.attributedText = title

}

お役に立てば幸いです。

1
vikas prajapati