NSString+KeyPaths.m 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. //
  2. // NSString+KeyPaths.m
  3. // TBTweakViewController
  4. //
  5. // Created by Tanner on 3/26/17.
  6. // Copyright © 2017 Tanner Bennett. All rights reserved.
  7. //
  8. #import "NSString+KeyPaths.h"
  9. @interface NSMutableString (Replacement)
  10. - (void)replaceOccurencesOfString:(NSString *)string with:(NSString *)replacement;
  11. - (void)removeLastKeyPathComponent;
  12. @end
  13. @implementation NSMutableString (Replacement)
  14. - (void)replaceOccurencesOfString:(NSString *)string with:(NSString *)replacement {
  15. [self replaceOccurrencesOfString:string withString:replacement options:0 range:NSMakeRange(0, self.length)];
  16. }
  17. - (void)removeLastKeyPathComponent {
  18. if (![self containsString:@"."]) {
  19. [self deleteCharactersInRange:NSMakeRange(0, self.length)];
  20. return;
  21. }
  22. BOOL putEscapesBack = NO;
  23. if ([self containsString:@"\\."]) {
  24. [self replaceOccurencesOfString:@"\\." with:@"\\~"];
  25. // Case like "UIKit\.framework"
  26. if (![self containsString:@"."]) {
  27. [self deleteCharactersInRange:NSMakeRange(0, self.length)];
  28. return;
  29. }
  30. putEscapesBack = YES;
  31. }
  32. // Case like "Bund" or "Bundle.cla"
  33. if (![self hasSuffix:@"."]) {
  34. NSUInteger len = self.pathExtension.length;
  35. [self deleteCharactersInRange:NSMakeRange(self.length-len, len)];
  36. }
  37. if (putEscapesBack) {
  38. [self replaceOccurencesOfString:@"\\~" with:@"\\."];
  39. }
  40. }
  41. @end
  42. @implementation NSString (KeyPaths)
  43. - (NSString *)stringByRemovingLastKeyPathComponent {
  44. if (![self containsString:@"."]) {
  45. return @"";
  46. }
  47. NSMutableString *mself = self.mutableCopy;
  48. [mself removeLastKeyPathComponent];
  49. return mself;
  50. }
  51. - (NSString *)stringByReplacingLastKeyPathComponent:(NSString *)replacement {
  52. // replacement should not have any escaped '.' in it,
  53. // so we escape all '.'
  54. if ([replacement containsString:@"."]) {
  55. replacement = [replacement stringByReplacingOccurrencesOfString:@"." withString:@"\\."];
  56. }
  57. // Case like "Foo"
  58. if (![self containsString:@"."]) {
  59. return [replacement stringByAppendingString:@"."];
  60. }
  61. NSMutableString *mself = self.mutableCopy;
  62. [mself removeLastKeyPathComponent];
  63. [mself appendString:replacement];
  64. [mself appendString:@"."];
  65. return mself;
  66. }
  67. @end