如何在Swift中向Unicode字符串添加属性?
如何在Swift中为UNICODE字符串添加属性 对于可变字节长度的UNICODE字符串,NSMakerRange似乎需要以字节为单位的字符串 有办法解决这个问题吗?提前谢谢如何在Swift中向Unicode字符串添加属性?,unicode,swift,Unicode,Swift,如何在Swift中为UNICODE字符串添加属性 对于可变字节长度的UNICODE字符串,NSMakerRange似乎需要以字节为单位的字符串 有办法解决这个问题吗?提前谢谢 var s:NSMutableAttributedString = NSMutableAttributedString(string: "வாங்க வாங்க வணக்கமுங்க") s.string[0...2] s.addAttribute(NSForegroundColorAttributeName, value
var s:NSMutableAttributedString = NSMutableAttributedString(string: "வாங்க வாங்க வணக்கமுங்க")
s.string[0...2]
s.addAttribute(NSForegroundColorAttributeName, value:UIColor(red:0.0, green:1.0, blue:0.0, alpha:1.0), range:NSMakeRange(0,3))
更新示例:
let text = "வாங்க வாங்க வணக்கமுங்க"
var startOfWord = advance(text.startIndex, 4)
var endOfWord = advance(startOfWord, 3)
var highlightRange = startOfWord..<endOfWord
text[startOfWord..<endOfWord]
let attrText = NSMutableAttributedString(string:text)
attrText.addAttribute(NSForegroundColorAttributeName, value:UIColor(red:0.0, green:1.0, blue:0.0, alpha:1.0), range:highlightRange)
let text=”வாங்க வாங்க வணக்கமுங்க"
var startOfWord=advance(text.startIndex,4)
var endOfWord=前进(开始字,3)
var highlightRange=startOfWord..您可以通过以下方式将swift字符串转换为swift NSString
var strAsNSString = "வாங்க வாங்க வணக்கமுங்க" as NSString
然后您可以创建NSMutableAttributedString。类似的方法可能会奏效:
let text = "வாங்க வாங்க வணக்கமுங்க"
var startOfWord = advance(text.startIndex, 5)
var endOfWord = advance(startOfWord, 5)
var range = startOfWord..<endOfWord
let text=”வாங்க வாங்க வணக்கமுங்க"
var startOfWord=advance(text.startIndex,5)
var endOfWord=前进(开始字,5)
var range=startOfWord..我希望下面的函数可以帮助您
func findAndAddAttributeString(str: String, query : String) {
let strASNSString = str as NSString
println("employeeIdAsNSString, \(strASNSString)")
var attributeDictionary = NSMutableDictionary(objects: [UIColor.grayColor(), UIFont.systemFontOfSize(17)], forKeys: [NSForegroundColorAttributeName, NSFontAttributeName])
println("attributeDictionary, \(attributeDictionary)")
var attributedEmployeeId = NSMutableAttributedString(string: strASNSString, attributes: attributeDictionary)
println("attributedEmployeeId = \(attributedEmployeeId)")
var error:NSError?
var regex = NSRegularExpression.regularExpressionWithPattern(query, options: NSRegularExpressionOptions.CaseInsensitive, error: &error)
println("regex = \(regex)")
var range = NSMakeRange(0, strASNSString.length)
println("range = \(range)")
regex.enumerateMatchesInString(strASNSString, options: nil, range: range, usingBlock:{ (textCheckingResult, MatchingFlags, unsafePointer) in
println("textCheckingResult \(textCheckingResult.rangeAtIndex(0))")
var subStringRange = textCheckingResult.rangeAtIndex(0)
attributedEmployeeId.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: subStringRange)
})
}
我为String
创建了一个小扩展,它既适用于基于Index
的范围,也适用于基于Int
的范围
extension String {
func NSRangeFromRange(swiftRange: Range<Index>) -> NSRange {
let start = swiftRange.startIndex.samePositionIn(utf16)
let end = swiftRange.endIndex.samePositionIn(utf16)
return NSRange(location: utf16.startIndex.distanceTo(start), length: start.distanceTo(end))
}
func NSRangeFromRange(swiftRange: Range<Int>) -> NSRange {
let indexRange = Range(start: startIndex.advancedBy(swiftRange.startIndex), end: startIndex.advancedBy(swiftRange.endIndex))
return NSRangeFromRange(indexRange)
}
}
扩展字符串{
func NSRangeFromRange(swiftRange:Range)->NSRange{
让start=swiftRange.startIndex.samePositionIn(utf16)
让end=swiftRange.endIndex.samePositionIn(utf16)
返回NSRange(位置:utf16.startIndex.distanceTo(开始),长度:start.distanceTo(结束))
}
func NSRangeFromRange(swiftRange:Range)->NSRange{
让indexRange=Range(开始:startIndex.advancedBy(swiftRange.startIndex),结束:startIndex.advancedBy(swiftRange.endIndex))
返回NSRangeFromRange(indexRange)
}
}
注意:函数位于String
类上,因为我们需要stringsUTF16View
在支持Unicode的范围
和不支持Unicode的NSRange
之间进行转换。谢谢。问题不是创建NSMutableAttributeString。问题是找到用于添加属性的范围。s.String[4..6]将给出第二个单词,例如,如果我需要突出显示该第二个单词,我如何使用NSMakeRange指定范围-该范围应以字节为单位。挑战是从swift range构造NSRange。我们如何做到这一点?let text=”வாங்க வாங்க வணக்கமுங்க“
var startoford=advance(text.startIndex,4)
var endoford=advance(startoford,3)
var highlightRange=startOfWord..对于UNICODE字符串,.length可能不起作用。用于查找精确范围的countElements和advance方法可能不起作用。有一种情况下,这种方法不能产生正确的结果,那就是带有肤色修饰符的表情符号。然而,这是Swift中的一个错误,因为它们会报告t字符的长度,如