Adds utility methods to NSString, for dealing with whitespace, string splitting, and other things.
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

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