![](/img/trans.png)
[英]Finding occurrences of String as NSRange from an NSString using Swift, result NSRange to be used in NSAttributedString
[英]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)。 然后,要获得范围的长度,请获取范围的起始索引到结束索引的距离。
我只是强制解开你的firstBraceIndex
和firstClosingBraceIndex
以使代码更容易阅读,但当然最好正确处理这些可能是零。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.