Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    220

    [Objective C] Oggetti NSString e NSMutableString

    Ciao a tutti,
    il mio non é un vero e proprio problema ma un dubbio che mi é venuto ora oggi che stavo guardando i sopracitati oggetti NSString e NSMutableString.

    Il primo si usa per dichiarare stringhe immutabili mentre il secondo per dichiarare stringhe su cui si possono eseguire operazioni come aggiungere (insertString), cancellare (deleteCharacterInRange), sostituire (replaceCharacterInRange) e probabilmente anche altre ma per ora ho visto questi metodi.

    Sul primo oggetto peró ho eseguito l'operazione:

    codice:
    NSString *frasone = [frasone stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSLog (frasoneBis);
    Che in realtá mi esegue un operazione di sostituzione e di fatto MODIFICA una stringa immutabile... Il dubbio che mi é sorto é piú che lecito... ma se si chiama immutabile perché la posso mutare? Se la posso mutare perché devo usare l'oggetto NSMutable String?
    C'e' qualcosa che mi sfugge...

    Chi mi puó spiegare sta cosa mi fa un piacere e se poi avete anche voglia di continuare a leggere...

    Secondo busillis che mi é sorto spontaneo... stavo eseguendo dei test per i fatti miei quando ho provato ad annidare il codice per scrivere una riga in meno quando mi é venuto un errore... giá che ci sono chiedo se qlc mi sa spiegare il perché non funziona...

    codice:
    NSString *frasone = @"Ma che bella frase che ho inventato...";
    NSLog (frasone);
    NSMutableString *frasoneMutabile = [NSMutableString stringWithString:frasone];
    NSLog (frasoneMutabile);
    [[frasoneMutabile replaceCharactersInRange:NSMakeRange(7, 5) withString:@"|ind|"] stringByReplacingOccurrencesOfString:@"|" withString:@""];
    NSLog (frasoneMutabile);
    Questo mi da errore di sintassi...

    In pratica alla quinta riga ho provato a sostituire una parola con |ind| e al contempo a levare le |

    Tutto in una riga sola annidando questi due comandi diversi:

    codice:
    [frasoneMutabile replaceCharactersInRange:NSMakeRange(7, 5) withString:@"|ind|"];
    frasoneMutabile = [frasoneMutabile stringByReplacingOccurrencesOfString:@"|" withString:@""];
    In una sola riga di codice:

    codice:
    [[frasoneMutabile replaceCharactersInRange:NSMakeRange(7, 5) withString:@"|ind|"] stringByReplacingOccurrencesOfString:@"|" withString:@""];
    Ringrazio anticipatamente chiunque abbia voglia di perdere un pó di tempo per darmi delucidazioni...

  2. #2

    Re: [Objective C] Oggetti NSString e NSMutableString

    Originariamente inviato da bernabaus
    codice:
    NSString *frasone = [frasone stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSLog (frasoneBis);
    Che in realtá mi esegue un operazione di sostituzione e di fatto MODIFICA una stringa immutabile... Il dubbio che mi é sorto é piú che lecito... ma se si chiama immutabile perché la posso mutare? Se la posso mutare perché devo usare l'oggetto NSMutable String?
    C'e' qualcosa che mi sfugge...
    La seguente che tu proponi:
    codice:
    	NSString *frasone = [frasone stringByReplacingOccurrencesOfString:@" " withString:@""];
    ha un comportamento indefinito, perché invochi un metodo di "frasone" prima che venga allocato e "svezzato".

    Immaginando che tu abbia fatto un errore di battitura ed intendessi scrivere:
    codice:
    	NSString *frasoneBis = [frasone stringByReplacingOccurrencesOfString:@" "
    in cui "frasone" è una NSString valida, allora invocando stringByReplacingOccurrencesOfString, NON modifichi "frasone", ma generi una nuova NSString, la frasoneBis appunto.

    Originariamente inviato da bernabaus
    codice:
    [[frasoneMutabile replaceCharactersInRange:NSMakeRange(7, 5) withString:@"|ind|"] stringByReplacingOccurrencesOfString:@"|" withString:@""];
    Questo mi da errore di sintassi...
    (la prossima volta copia ed incolla l'errore che ti da il compilatore..)..
    In ogni modo:

    http://developer.apple.com/library/m...Reference.html
    codice:
    Replaces the characters in the given range with the characters of the given string.
    
    - (void)replaceCharactersInRange: (NSRange)aRange withString: (NSString *)aString
    non restituisce nulla "- (void)"; e tu cerchi di invocare "stringByReplacingOccurrencesOfString" appunto sul (da te) presunto valore restituito da replaceCharactersInRange (che però non restituisce un bel nulla), perciò l'errore di sintassi.

    Il tuo scopo di "annidare per scrivere una riga in meno" è in genere errato, e può generare errori subdoli in Objective-C/C++ dagli effetti catastrofici, che in questo caso ti è stato evitato grazie all'errore in fase di compilazione.
    ;-)

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    220
    Hai ragione... ho sbagliato perché ho modificato il codice quando l'ho inserito (volevo togliere il Bis ma l'ho tolto solo nella prima riga), in realtá ció che avevo scritto era:

    codice:
    NSString *frasoneBis = [frasone stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSLog (frasoneBis);
    qui "frasone" é gia una stringa immutabile perfettamente dichiarata in precedenza e cosi facendo creo una nuova stringa immutabile "frasoneBis" che contiene "frasone" senza gli spazi...

    Invece in quello che avevo incollato prima:

    codice:
    NSString *frasone = [frasone stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSLog (frasoneBis);
    Cerco di dichiarare "frasone" che dovrebbe contenere se stesso senza gli spazi... ma non contiene ancora una bella cippa di nulla visto che non esiste ancora... e poi oltrettutto cerco di stampare a video un oggetto che manco esiste ovvero "frasoneBis"

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2002
    Messaggi
    220
    Per spiegare meglio come ho provato a usare il metodo replaceCharacterInRange incollo qui tutto e non un estrapolato:

    codice:
    NSString *frasone = @"Ma che bella frase che ho inventato...";
    NSLog (frasone);
    NSMutableString *frasoneMutabile = [NSMutableString stringWithString:frasone];
    NSLog (frasoneMutabile);
    [frasoneMutabile replaceCharactersInRange:NSMakeRange(7, 5) withString:@"|ind|"];
    NSLog (frasoneMutabile);
    frasoneTrisMutabile = [frasoneTrisMutabile stringByReplacingOccurrencesOfString:@"|" withString:@""];
    NSLog (frasoneMutabile);
    Questo é quello che provo a fare:

    - creo frasone e gli assegno una stringa
    - creo stringa mutabile frasoneMutabile e gli assegno il contenuto di frasone
    - sostituisco all'indice 7 di frasoneMutabile le 5 lettere che trova con |ind|
    - cerco di levare le |

    Cosi funziona e in console tutto appare come volevo anche se il compilatore mi dice (warning in giallo):
    assignement from distict Objective-C type

    Non capisco cosa voglia dire ma va bene lo stesso... tanto é un esercizio e alla fine funziona...


    A questo punto per annidare le ultime due istruzioni provo a seguire l'idea che in Objective-C si usano i metodi come mesaggi da inviare ad un ricevitore:

    [ricevitore messaggio]

    E cerco di usare come ricevitore:

    codice:
    [frasoneMutabile replaceCharactersInRange:NSMakeRange(7, 5) withString:@"|ind|"]
    E come messaggio:

    codice:
    stringByReplacingOccurrencesOfString:@"|" withString:@""
    E unisco le due righe cosi:

    codice:
    [[frasoneMutabile replaceCharactersInRange:NSMakeRange(7, 5) withString:@"|ind|"] stringByReplacingOccurrencesOfString:@"|" withString:@""];
    E il compilatore mi urla dietro:

    error: syntax error before 'stringByReplaceOccurencesOfString'

    Probabilmente, penso io, gli manca il ricevitore... ovvero non mi prende tutto quello in quadra come ricevente del metodo...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.