mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			50 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Swift
		
	
		
		
			
		
	
	
			50 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Swift
		
	
| 
											8 years ago
										 | // | ||
|  | //  Copyright (c) 2018 Open Whisper Systems. All rights reserved. | ||
|  | // | ||
|  | 
 | ||
|  | import Foundation | ||
|  | 
 | ||
|  | public extension String { | ||
|  | 
 | ||
|  |     // Truncates string to be less than or equal to byteCount, while ensuring we never truncate partial characters for multibyte characters. | ||
|  |     public func truncated(toByteCount byteCount: UInt) -> String? { | ||
|  |         var lowerBoundCharCount = 0 | ||
|  |         var upperBoundCharCount = self.count | ||
|  | 
 | ||
|  |         while (lowerBoundCharCount < upperBoundCharCount) { | ||
|  |             guard let upperBoundData = self.prefix(upperBoundCharCount).data(using: .utf8) else { | ||
|  |                 owsFail("in \(#function) upperBoundData was unexpectedly nil") | ||
|  |                 return nil | ||
|  |             } | ||
|  | 
 | ||
|  |             if upperBoundData.count <= byteCount { | ||
|  |                 break | ||
|  |             } | ||
|  | 
 | ||
|  |             // converge | ||
|  |             if upperBoundCharCount - lowerBoundCharCount == 1 { | ||
|  |                 upperBoundCharCount = lowerBoundCharCount | ||
|  |                 break | ||
|  |             } | ||
|  | 
 | ||
|  |             let midpointCharCount = (lowerBoundCharCount + upperBoundCharCount) / 2 | ||
|  |             let midpointString = self.prefix(midpointCharCount) | ||
|  | 
 | ||
|  |             guard let midpointData = midpointString.data(using: .utf8) else { | ||
|  |                 owsFail("in \(#function) midpointData was unexpectedly nil") | ||
|  |                 return nil | ||
|  |             } | ||
|  |             let midpointByteCount = midpointData.count | ||
|  | 
 | ||
|  |             if midpointByteCount < byteCount { | ||
|  |                 lowerBoundCharCount = midpointCharCount | ||
|  |             } else { | ||
|  |                 upperBoundCharCount = midpointCharCount | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         return String(self.prefix(upperBoundCharCount)) | ||
|  |     } | ||
|  | 
 | ||
|  | } |