let fullString = "Hello world, there are \(string(07)) continents and \(string(195)) countries."
let range = [NSMakeRange(24,2), NSMakeRange(40,3)]
需要在整个完整字符串中查找数字的NSRange,并且两个数字可能相同。当前的硬编码如上图所示,消息可能是动态的,其中硬编码值将出现问题。
我已经拆分了字符串,并尝试获取NSRange
,因为可能存在相同的值,如stringOne和stringTwo。
func findNSMakeRange(initialString:String, fromString: String) {
let fullStringRange = fromString.startIndex..<fromString.endIndex
fromString.enumerateSubstrings(in: fullStringRange, options: NSString.EnumerationOptions.byWords) { (substring, substringRange, enclosingRange, stop) -> () in
let start = distance(fromString.startIndex, substringRange.startIndex)
let length = distance(substringRange.startIndex, substringRange.endIndex)
let range = NSMakeRange(start, length)
if (substring == initialString) {
print(substring, range)
}
})
}
接收错误,如Cannot invoke distance with an argument list of type (String.Index, String.Index)
有人有更好的解决办法吗?
1条答案
按热度按时间t3psigkw1#
您说您希望迭代字符串中的
NSRange
匹配项,以便将粗体属性应用于相关的子字符串。在Swift 5.7及更高版本中,您可以使用新的Regex:
或者,如果您发现传统的正则表达式太晦涩难懂,可以导入
RegexBuilder
,然后使用新的regex DSL:在Swift 5.7之前的版本中,我们将使用
NSRegularExpression
。例如:就我个人而言,在Swift 5.7之前,我发现有一个返回Swift范围数组的方法很有用,例如
[Range<String.Index>]
:然后您可以这样使用它:
然后你可以把
map
和Range
转换成NSRange
。回到最初的例子,如果你想在某个属性化的字符串中把这些数字加粗:资源: