簡體   English   中英

如何在Swift中向Unicode字符串添加屬性?

[英]How do you add an attribute to an Unicode string in Swift?

如何在Swift中向UNICODE字符串添加屬性?

對於可變字節長度的UNICODE字符串,NSMakeRange似乎期望String以字節為單位。

有辦法解決這個問題嗎? 提前致謝。

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)

如何從swift Range構建NSRange?

我為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)
    }
}

注意:該函數在String類上,因為我們需要字符串UTF16View在Unicode感知Range<Index>和非Unicode感知NSRange之間進行轉換。

我希望以下功能可以幫助你

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)
        })
}

您可以將swift String轉換為Swift NSString

var strAsNSString = "வாங்க வாங்க வணக்கமுங்க" as NSString

然后你可以創建NSMutableAttributedString。

像這樣的東西可能會起作用:

let text = "வாங்க வாங்க வணக்கமுங்க"
var startOfWord = advance(text.startIndex, 5)
var endOfWord = advance(startOfWord, 5)
var range = startOfWord..<endOfWord

即使需要做更多的工作來確定前進的程度(如果你只想找到一個已知單詞,你可以直接用NSRangeFromString獲得它)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM