Skip to content

Commit 41fcaba

Browse files
committed
Speedup for NSString -getCharacters:range:
1 parent 9aabdda commit 41fcaba

File tree

1 file changed

+7
-4
lines changed

1 file changed

+7
-4
lines changed

Foundation/NSString.swift

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -343,9 +343,12 @@ open class NSString : NSObject, NSCopying, NSMutableCopying, NSSecureCoding, NSC
343343

344344
extension NSString {
345345
public func getCharacters(_ buffer: UnsafeMutablePointer<unichar>, range: NSRange) {
346-
for idx in 0..<range.length {
347-
buffer[idx] = character(at: idx + range.location)
348-
}
346+
let utf16 = _storage.utf16
347+
var idx = utf16.index(utf16.startIndex, offsetBy: range.location)
348+
for offset in 0..<range.length {
349+
buffer[offset] = utf16[idx]
350+
idx = utf16.index(after: idx)
351+
}
349352
}
350353

351354
public func substring(from: Int) -> String {
@@ -368,7 +371,7 @@ extension NSString {
368371
if type(of: self) == NSString.self || type(of: self) == NSMutableString.self {
369372
let start = _storage.utf16.startIndex
370373
let min = _storage.utf16.index(start, offsetBy: range.location)
371-
let max = _storage.utf16.index(start, offsetBy: range.location + range.length)
374+
let max = _storage.utf16.index(min, offsetBy: range.length)
372375
return String(decoding: _storage.utf16[min..<max], as: UTF16.self)
373376
} else {
374377
let buff = UnsafeMutablePointer<unichar>.allocate(capacity: range.length)

0 commit comments

Comments
 (0)