2013-02-25 9 views
41

Czy istnieje krótki sposób powiedzieć „cały ciąg” zamiast wpisywania:Skrót do generowania NSRange dla całej długości NSString?

NSMakeRange(0, myString.length)] 

Wydaje się głupie, że najdłuższa część tego rodzaju kodu jest najmniej ważne (bo zazwyczaj chcą szukać/wymienić w ciągu całego ciągu znaków) ...

[myString replaceOccurrencesOfString:@"replace_me" 
          withString:replacementString 
          options:NSCaseInsensitiveSearch 
           range:NSMakeRange(0, myString.length)]; 
+0

Jeśli potrzebujesz więcej niż 5 razy, a następnie można dokonać Metoda/kategorię, ale pod 5 razy twój 'NSMakeRange (0, myString.length)]' będzie krótszy, prawda? –

Odpowiedz

37

Funkcja? Metoda kategorii?

- (NSRange)fullRange 
{ 
    return (NSRange){0, [self length]}; 
} 

[myString replaceOccurrencesOfString:@"replace_me" 
          withString:replacementString 
          options:NSCaseInsensitiveSearch 
           range:[myString fullRange]]; 
+6

Hah. Wspaniale, że obaj nazwaliśmy go "fullRange", i że obaj używaliśmy nowych, złożonych literałów jednocześnie. –

+1

Rzeczywiście. I komentowane w tym samym czasie! –

+0

Literały działają dobrze, ale możesz również zwrócić NSMakeRange (0, [self length]); Jeśli chciałeś. –

19

Nie to, co wiem. Ale można łatwo dodać kategorię:

@interface NSString (MyRangeExtensions) 
- (NSRange)fullRange 
@end 

@implementation NSString (MyRangeExtensions) 
- (NSRange)fullRange { 
    return (NSRange){0, self.length}; 
} 
+3

Geez, daliśmy mu to samo. –

7

To nie jest krótsza, ale ... No cóż

NSRange range = [str rangeOfString:str]; 
+6

Sprytny. Waham się jednak wprowadzić coś, co może być dużo pracy procesora (dopasowanie długiego łańcucha przeciwko sobie), ze względu na stosunkowo niewielką zaletę mniejszego pisania dla mnie programisty. –

+0

I masz rację, czasami trochę więcej kodu czyni go bardziej czytelnym i wydajnym. – Odrakir

+0

Użyłem tego również i natknąłem się na problem: jeśli twój ciąg stanie się pusty (@ ""), otrzymasz {NSNotFound, 0}. – Shinigami

6

Swift

NSMakeRange(0, str.length) 

lub jako extension:

extension NSString { 
    func fullrange() -> NSRange { 
     return NSMakeRange(0, self.length) 
    } 
} 
+0

Nie ma powodu, aby pracować z 'NSString' w Swift. –

+3

Prawidłowo. Ale pytanie brzmi "Skrót do generowania NSRange dla całej długości NSString" – SwiftArchitect

+0

Pytanie dotyczy także celu C. Jeśli używasz Swift, użyj także String. –

5

Swift 2:

extension String { 
    var fullRange:Range<String.Index> { return startIndex..<endIndex } 
} 

jak w

let swiftRange = "abc".fullRange 

lub

let nsRange = "abc".fullRange.toRange 
+0

Dla '" abc ".fullRange.toRange', otrzymuję błąd czasu kompilacji:" Wartość typu "Zakres '(vel" Range ') nie ma członka "toRange" . " Używam Xcode 8.3.3 z Swift 3.1. – ma11hew28