2013-02-25 14 views
41

C'è una strada più breve per dire "tutta la stringa" piuttosto che digitando:Collegamento per generare un NSRange per l'intera lunghezza di NSString?

NSMakeRange(0, myString.length)] 

Sembra sciocco che la parte più lunga di questo tipo di codice è il meno importante (perché io di solito voglio cercare/sostituzione nell'intera stringa) ...

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

Se avete bisogno di più di 5 volte, allora si può fare un metodo/categoria, ma per meno di 5 volte il tuo 'NSMakeRange (0, myString.length)]' sarà più breve, non è vero? –

risposta

37

funzione? Metodo di categoria?

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

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

Hah. È fantastico che entrambi lo abbiamo chiamato 'fullRange', e che entrambi abbiamo usato i nuovi letterali composti, allo stesso tempo. –

+1

Infatti. E ha commentato allo stesso tempo! –

+0

I valori letterali funzionano correttamente, ma è possibile anche restituire NSMakeRange (0, [lunghezza propria]); se tu volessi. –

19

Non che io sappia. Ma si potrebbe facilmente aggiungere un NSString categoria:

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

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

Accidenti, abbiamo persino dato lo stesso nome. –

7

Questo non è più breve, ma ... vabbè

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

Intelligente. Ma esita a introdurre quello che potrebbe essere un sacco di lavoro della CPU (abbinare una lunga stringa contro se stesso) per il beneficio relativamente piccolo di un po 'meno di digitazione per il programmatore. –

+0

E hai ragione, a volte un po 'più di codice lo rende più leggibile ed efficiente. – Odrakir

+0

Ho usato anche questo e ho avuto un problema: se la tua stringa risulta vuota (@ ""), ottieni {NSNotFound, 0}. – Shinigami

6

Swift

NSMakeRange(0, str.length) 

o come extension:

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

Non c'è motivo di lavorare con 'NSString' in Swift. –

+3

corretto. Ma la domanda è "Collegamento per generare un NSRange per l'intera lunghezza di NSString" – SwiftArchitect

+0

La domanda riguarda anche Objective-C. Se usi Swift, usa anche String. –

5

Swift 2:

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

come in

let swiftRange = "abc".fullRange 

o

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

Per "" abc ".fullRange.toRange', viene visualizzato l'errore di compilazione:" Valore di tipo "Intervallo " (noto anche come "Intervallo ") non ha alcun membro 'toRange' ". Sto eseguendo Xcode 8.3.3 con Swift 3.1. – ma11hew28

Problemi correlati