7 berichten aan het bekijken - 1 tot 7 (van in totaal 7)
  • Q:
    Bijdrager
    Wesdegroot

    functie maken

    beste,

    ik probeer al een tijdje een functie te creëren maar het misukt dan krijg ik een error met linken

    ik heb

    <br />
     NSString *text = @"dit is text.\nmet smilies :)\nen die smilies wil ik gereplaced hebben";<br />
     

    en dan zou ik iets willen van

    <br />
     text = [text addsmilies]; //of iets in die richting<br />
     

    ipv een hele lange lijst als vb:

    <br />
        text = [text stringByReplacingOccurrencesOfString:@":)" withString:@"\ue415"];<br />
        text = [text stringByReplacingOccurrencesOfString:@":)" withString:@"\ue415"];<br />
        text = [text stringByReplacingOccurrencesOfString:@":)" withString:@"\ue415"];<br />
        text = [text stringByReplacingOccurrencesOfString:@":)" withString:@"\ue415"];<br />
     
    Bijdrager
    Jakko Westerbeke

    Negeer dit maar, ik had niet goed gekeken:)

    Bijdrager
    Bodevinaat

    Ahhh je probeert iets te bakken met xCode? Misschien handig als je dat aangeeft. Zoek eens op Regex. -Regular Expressions…

    Bijdrager
    Jakko Westerbeke

    Volgens mij begrijp je verkeerd wat de bedoeling is — ik denk dat het voorbeeld wat slecht gekozen is omdat het vier dezelfde vervanging bevat terwijl stringByReplacingOccurrencesOfString:withString: álle keren dat de zoekstring voorkomt al vervangt waardoor er dus drie overbodig zijn. Wat ik opmaak uit de vraag is dat Wes het volgende wil doen (voorbeeld in Python, want ik spreek geen Objective C):

    def addsmilies(text):<br />
    	text = text.replace(":)", unichr(0xE415))<br />
    	text = text.replace(":(", unichr(0xE416))	# Of wat dan ook het bijbehorende Unicode-teken moge zijn<br />
    	text = text.replace(";)", unichr(0xE417))<br />
    	return text

    zodat dit aan te roepen is als:

    text = addsmilies("Dit is tekst.\nMet smilies :)\nEn die smilies wil ik vervangen hebben")

    Het enige probleem daaraan is dat het nog altijd een lange lijst aan vervangingen veroorzaakt, alleen staan die nu in een aparte functie in plaats van midden tussen andere code.

    Of begrijp ik het ook verkeerd en wil je dit als een lus (loop) doen zodat de code korter kan zijn? In dat geval heb je geen functie nodig, maar iets dat neerkomt op de Objective C-tegenhanger van:

    for smiley, vervanging in {":)": unichr(0xE415), ":(": unichr(0xE416), ";)": unichr(0xE417)}.items():<br />
    	text = text.replace(smiley, vervanging)
    Bijdrager
    lord anubis

    Oke,
    Ik zie net pas je vraag Wes.Maar weet niet of je het al opgelost hebt. Maar ik wil toch wat aanvullingen doen op je vraag.

    Je vraagt om een functie, alhoewel je in Obj-C een functie kan maken vanwege de C afkomst, wil jij een Method.

    Je komt met een [text addSmilies] als code.
    wat je hier schrijft betekend dat addSmilies een method is van text. Aangezien text een object is van een NSString Class en addSmilies daarin niet bestaat moet je een category maken. Je zou ook een subClass kunnen maken. maar dat betekend weer dat je text object een object van je subClass moet zijn en niet meer een NSString object. Beide ideeen hebben hun voor en nadelen.

    Wat jacco schrijft over [text stringByReplacingOccurrencesOfString:@”:)” withString:@”\ue415″]; klopt je doet vier keer het zelfde, maar ik denk dat je daar nu wel achter bent.

    Om bij jacco’s opmerking en de category te blijven kan je dus voor iedere smilley een regel maken.
    Verpak al deze regels in je category ( zie de link hoe dat te doen ).

    Houd er rekening mee dat je NSString niet mutable is en maak in je Category in de substituteSmilley method een tijdelijke NS(Mutable)String aan, bewerk deze met je stringByReplacingOccurrencesOfString en stuur het resultaat weer terug met je return.

    Wat jacco schrijft over een loop kan ook, maar dan zet je ze, de text smileys eerst in een NSDictionary met je ‘smillie in tekst’ als key en je UTF string als object.

    Let ook op de volgorde, een vervanging van : )) loopt fout als je eerst test op : ).

    Hou er echter rekening mee dat je smilies waarschijnlijk utf-16 zijn i.p.v utf-8 encoding.

    Maar dat is op te zoeken.

    HTH

    Bijdrager
    vanpuffelen

    Ik ben een ervaren programmeur die net Objective-C aan het leren is en vond dit een interessant probleem. Als oplossing kies ik voor een Category. Vereist Xcode 4.5.

    StringUtils.h:

    <br />
    @interface NSString (stringutils)<br />
    <br />
    -(NSString *) stringByReplacingOccurrencesOfString:(NSDictionary *)dict;<br />
    -(NSString *) smile;<br />
    <br />
    @end<br />
     

    StringUtils.m:

    <br />
    #import "StringUtils.h"<br />
    <br />
    @implementation NSString (stringutils)<br />
    <br />
    -(NSString *) stringByReplacingOccurrencesOfString:(NSDictionary *)dict {<br />
        NSMutableString *str = [[NSMutableString alloc] initWithString:self];<br />
        for (NSString *key in [dict allKeys]) {<br />
            [str replaceOccurrencesOfString:key withString:[dict valueForKey:key] options:NSLiteralSearch range:NSMakeRange(0, [str length])];<br />
        }<br />
        return str;<br />
    }<br />
    <br />
    static NSDictionary *smileys = nil;<br />
    <br />
    -(NSString *) smile {<br />
        if (smileys == nil) {<br />
            smileys = @{@":)" : @"\U0001F604",<br />
                        @":(" : @"\U0001F620",<br />
                        @":-]": @"\U0001F62C"};<br />
        }<br />
        return [self stringByReplacingOccurrencesOfString:smileys];<br />
    }<br />
    <br />
    @end<br />
     

    En tenslotte main.m:

    <br />
    #import <Foundation/Foundation.h><br />
    #import "StringUtils.h"<br />
    <br />
    int main (int argc, const char * argv[])<br />
    {<br />
        @autoreleasepool {<br />
            NSString *str  = @"Een blije :), een grijns :-] en nog een blije:) en een boze :(";<br />
            NSLog(@"String: %@", str);<br />
            NSString *smiled = [str smile];<br />
            NSLog(@"Smiled: %@", smiled);<br />
        }<br />
        return 0;<br />
    }<br />
     
    Bijdrager
    Wesdegroot

    @vanpuffelen precies wat ik zocht!!! dankjewel

7 berichten aan het bekijken - 1 tot 7 (van in totaal 7)

Je moet ingelogd zijn om een reactie op dit onderwerp te kunnen geven.