繁体   English   中英

在NSAttributedString API中使用Range <Index>和NSRange

[英]Using Range<Index> with NSRange in the NSAttributedString API

我正在尝试确定String给定字符串出现的索引,然后使用这些索引生成NSRange ,以便将属性添加到NSMutableAttributedString 问题是rangeOfString返回Range<Index>addAttributes:range:需要NSRange 我尝试从Range的开始和结束索引创建NSRange失败,因为String.CharacterView.Index不是Int ,因此它不会编译。

如何使用Range<Index>值创建NSRange

var originalString = "Hello {world} and those who inhabit it."

let firstBraceIndex = originalString.rangeOfString("{") //Range<Index>
let firstClosingBraceIndex = originalString.rangeOfString("}")

let range = NSMakeRange(firstBraceIndex.startIndex, firstClosingBraceIndex.endIndex)
//compile time error: cannot convert value of type Index to expected argument type Int

let attributedString = NSMutableAttributedString(string: originalString)
attributedString.addAttributes([NSFontAttributeName: boldFont], range: range)

如果您从原始字符串转换为Cocoa NSString开头:

var originalString = "Hello {world} and those who inhabit it." as NSString

...然后你的范围结果将是NSRange,你将能够将它们交还给Cocoa。

要创建NSRange,您需要获取范围的起始位置和长度作为整数。 您可以使用originalString上的distance(from:to:)方法执行此操作:

let rangeStartIndex = firstBraceIndex!.lowerBound
let rangeEndIndex = firstClosingBraceIndex!.upperBound

let start = originalString.distance(from: originalString.startIndex, to: rangeStartIndex)
let length = originalString.distance(from: rangeStartIndex, to: rangeEndIndex)

let nsRange = NSMakeRange(start, length)

let attributedString = NSMutableAttributedString(string: originalString)
attributedString.addAttributes([NSFontAttributeName: boldFont], range: nsRange)

要获得startingLocation,请从距离originalString的了startIndex,你想要的范围的起始索引(而你的情况将是firstBraceIndex.lowerBound如果要包括{ ,或firstBraceIndex.upperBound如果你不“T)。 然后,要获得范围的长度,请获取范围的起始索引到结束索引的距离。

我只是强制解开你的firstBraceIndexfirstClosingBraceIndex以使代码更容易阅读,但当然最好正确处理这些可能是零。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM