Skip to content

Commit a87d4aa

Browse files
committed
Untested speedup for NSString -getCharacters:range:
1 parent 9aabdda commit a87d4aa

File tree

1 file changed

+5
-3
lines changed

1 file changed

+5
-3
lines changed

Foundation/NSString.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -343,8 +343,10 @@ 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)
346+
let utf16 = _storage.utf16
347+
let min = utf16.index(utf16.startIndex, offsetBy: range.location) //NSNotFound handling?
348+
for (char, idx) in zip(utf16[min...], 0..<range.length) {
349+
buffer[idx] = char
348350
}
349351
}
350352

@@ -368,7 +370,7 @@ extension NSString {
368370
if type(of: self) == NSString.self || type(of: self) == NSMutableString.self {
369371
let start = _storage.utf16.startIndex
370372
let min = _storage.utf16.index(start, offsetBy: range.location)
371-
let max = _storage.utf16.index(start, offsetBy: range.location + range.length)
373+
let max = _storage.utf16.index(min, offsetBy: range.length)
372374
return String(decoding: _storage.utf16[min..<max], as: UTF16.self)
373375
} else {
374376
let buff = UnsafeMutablePointer<unichar>.allocate(capacity: range.length)

0 commit comments

Comments
 (0)