Adds utility methods to NSString, for dealing with whitespace, string splitting, and other things.
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

NSString+SA_NSStringExtensions.m 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. //
  2. // NSString+SA_NSStringExtensions.m
  3. //
  4. // Copyright (c) 2016 Said Achmiz.
  5. //
  6. // This software is licensed under the MIT license.
  7. // See the file "LICENSE" for more information.
  8. #import "NSString+SA_NSStringExtensions.h"
  9. #import "NSRange-Conventional.h"
  10. @implementation NSString (SA_NSStringExtensions)
  11. - (BOOL)containsCharactersInSet:(NSCharacterSet *)characters
  12. {
  13. NSRange rangeOfCharacters = [self rangeOfCharacterFromSet:characters];
  14. return rangeOfCharacters.location != NSNotFound;
  15. }
  16. - (BOOL)containsCharactersInString:(NSString *)characters
  17. {
  18. return [self containsCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:characters]];
  19. }
  20. - (NSRange)firstWhitespaceAfterRange:(NSRange)aRange
  21. {
  22. NSRange restOfString = NSRangeMake(NSRangeMax(aRange), self.length - NSRangeMax(aRange));
  23. NSRange firstWhitespace = [self rangeOfCharacterFromSet:[NSCharacterSet whitespaceCharacterSet] options:0 range:restOfString];
  24. return firstWhitespace;
  25. }
  26. - (NSRange)firstNonWhitespaceAfterRange:(NSRange)aRange
  27. {
  28. NSRange restOfString = NSRangeMake(NSRangeMax(aRange), self.length - NSRangeMax(aRange));
  29. NSRange firstNonWhitespace = [self rangeOfCharacterFromSet:[[NSCharacterSet whitespaceCharacterSet] invertedSet] options:0 range:restOfString];
  30. return firstNonWhitespace;
  31. }
  32. - (NSRange)rangeAfterRange:(NSRange)aRange
  33. {
  34. return NSRangeMake(NSRangeMax(aRange), self.length - NSRangeMax(aRange));
  35. }
  36. - (NSRange)rangeFromEndOfRange:(NSRange)aRange
  37. {
  38. return NSRangeMake(NSRangeMax(aRange) - 1, self.length - NSRangeMax(aRange) + 1);
  39. }
  40. - (NSRange)rangeToEndFrom:(NSRange)aRange
  41. {
  42. return NSRangeMake(aRange.location, self.length - aRange.location);
  43. }
  44. - (NSArray <NSString *> *)componentsSplitByWhitespace
  45. {
  46. return [self componentsSplitByWhitespaceWithMaxSplits:NSUIntegerMax];
  47. }
  48. - (NSArray <NSString *> *)componentsSplitByWhitespaceWithMaxSplits:(NSUInteger)maxSplits
  49. {
  50. if(maxSplits == 0)
  51. {
  52. return [NSMutableArray arrayWithObject:self];
  53. }
  54. __block NSMutableArray <NSString *> *components = [NSMutableArray array];
  55. __block NSUInteger tokenStart;
  56. __block NSUInteger tokenEnd;
  57. __block BOOL currentlyInToken = NO;
  58. __block NSRange tokenRange = NSRangeMake(NSNotFound, 0);
  59. __block NSUInteger splits = 0;
  60. [self enumerateSubstringsInRange:NSRangeMake(0, self.length)
  61. options:NSStringEnumerationByComposedCharacterSequences
  62. usingBlock:^(NSString *character, NSRange characterRange, NSRange enclosingRange, BOOL *stop)
  63. {
  64. if(currentlyInToken == NO && [character containsCharactersInSet:[[NSCharacterSet whitespaceCharacterSet] invertedSet]])
  65. {
  66. currentlyInToken = YES;
  67. tokenStart = characterRange.location;
  68. }
  69. else if(currentlyInToken == YES && [character containsCharactersInSet:[NSCharacterSet whitespaceCharacterSet]])
  70. {
  71. currentlyInToken = NO;
  72. tokenEnd = characterRange.location;
  73. tokenRange = NSRangeMake(tokenStart, tokenEnd - tokenStart);
  74. [components addObject:[self substringWithRange:tokenRange]];
  75. splits++;
  76. if(splits == maxSplits)
  77. {
  78. *stop = YES;
  79. NSRange lastTokenRange = [self rangeToEndFrom:[self firstNonWhitespaceAfterRange:tokenRange]];
  80. if(lastTokenRange.location != NSNotFound)
  81. {
  82. [components addObject:[self substringWithRange:lastTokenRange]];
  83. }
  84. }
  85. }
  86. }];
  87. // If we were in a token when we got to the end, add that last token.
  88. if(splits < maxSplits && currentlyInToken == YES)
  89. {
  90. tokenEnd = self.length;
  91. tokenRange = NSRangeMake(tokenStart, tokenEnd - tokenStart);
  92. [components addObject:[self substringWithRange:tokenRange]];
  93. }
  94. return components;
  95. }
  96. @end