@@ -324,21 +324,33 @@ extension String.UTF8View {
324
324
public var span : Span < UTF8 . CodeUnit > {
325
325
@lifetime ( borrow self)
326
326
borrowing get {
327
+ #if _runtime(_ObjC)
328
+ // handle non-UTF8 Objective-C bridging cases here
329
+ if !_guts. isFastUTF8 && _guts. _object. hasObjCBridgeableObject {
330
+ let storage : __StringStorage
331
+ if let associated = _guts. getAssociatedStorage ( ) {
332
+ storage = associated
333
+ }
334
+ else {
335
+ storage = _guts. getOrAllocateAssociatedStorage ( )
336
+ }
337
+ let ( start, count) = unsafe ( storage. start, storage. count)
338
+ let span = unsafe Span( _unsafeStart: start, count: count)
339
+ return unsafe _override Lifetime ( span, borrowing: self )
340
+ }
341
+ #endif
327
342
let count = _guts. count
328
343
if _guts. isSmall {
329
344
let a = Builtin . addressOfBorrow ( self )
330
345
let address = unsafe UnsafePointer< UTF8 . CodeUnit > ( a)
331
346
let span = unsafe Span( _unsafeStart: address, count: count)
332
347
return unsafe _override Lifetime ( span, borrowing: self )
333
348
}
334
- else if _guts. isFastUTF8 {
335
- let buffer = unsafe _guts. _object . fastUTF8
336
- _internalInvariant ( count == buffer. count)
337
- let span = unsafe Span( _unsafeElements: buffer)
338
- return unsafe _override Lifetime ( span, borrowing: self )
339
- }
340
- // handle other Objective-C bridging cases here
341
- fatalError ( " Some bridged Strings are not supported at this time " )
349
+ _precondition ( _guts. isFastUTF8)
350
+ let buffer = unsafe _guts. _object . fastUTF8
351
+ _internalInvariant ( count == buffer. count)
352
+ let span = unsafe Span( _unsafeElements: buffer)
353
+ return unsafe _override Lifetime ( span, borrowing: self )
342
354
}
343
355
}
344
356
}
0 commit comments