Odpowiedz na ten temat
Pokaż wyniki od 1 do 10 z 10

  1. Dołączył
    Dec 2007
    Skąd
    Gdynia
    Postów
    31

    Cytuj | #1

    Cześć wszystkim,

    Przygodę z programowanie zaczynam od objective-c i cocoa. Są to moje pierwsze kroki więc z góry przepraszam za wszelkie błędy w profesjonalnym słownictwie.

    Na samym początku przedstawię kod jaki jest dla mnie problematyczny:

    "ViewController.m"
    Kod:
    - (PoorSlimBrain *)brain
    {
    	if (!brain) {
    		brain = [[PoorSlimBrain alloc] init];
    	}
    	return brain;	
    }
    - (IBAction)pushButtonForResult:(id)sender
    {
                [......]
    
                [self brain].neatResult = [typeOfBodyPopUp titleOfSelectedItem]; // tutaj    uzyskujemy NSString
                
                [......]
    
    }
    "Brain.h"
    Kod:
    @interface Brain : NSObject {
    	
    
    
    }
    
    @property int neatResult;
    
    [.....]
    "Brain.m"
    Kod:
    [.....]
    
    @implementation Brain
    @synthesize neatResult;
    
    [.....]
    
    - (void) neatResult:(NSString *)typeOfBody
    {
    	
    	int countNeatResult;
    	
    	if ([@"endomorfik" isEqual:typeOfBody]){
    		countNeatResult = 400;
    	} else if ([@"ektomorfik" isEqual:typeOfBody]) {
    		countNeatResult = 900;
    	} else {
    		countNeatResult = 500;
    	}
    	
    	neatResult = countNeatResult;
    
    }
    
    [.....]
    Na czym polega problem, pewno co nie którzy już wiedzą: "passing argument 1 of 'setNeatResult:' makes integer from pointer without a cast' " to wypluwa mi compilator. Wiem na czym mniej więcej polega błąd (na czerwono zaznaczyłem elementy które moim zdaniem ze sobą kolidują).Czy nie ma możliwości przekazania do "settera" parametru o innym typie danych niż ustawione jest podczas inicjowania accessora? jeśli coś pokręciłem to wybaczcie, proszę o sprostowanie.
    Ostatnio edytowane przez xawoger ; 18.01.2011 o 19:31 Powód: literówki
    Komputer: iMac 20" 2,4ghz alu
    Telefon: iPhone 8gb 1.1.4
    Odtwarzacz: iPod Classic



  2. Dołączył
    Nov 2010
    Postów
    8

    Cytuj | #2

    Też się ciągle uczę, ale jak chcesz zastąpić settera generowanego przez @synthezise to musisz to zrobić tak:
    Kod:
     -(void) setNeatResult:(NSString*)value
    Ale najlepiej napisz sobie do tego inna funkcja bo moim zdaniem za bardzo kombinujesz

  3. Avatar Roberto
    Dołączył
    Feb 2007
    Skąd
    Wrocław
    Postów
    11,859

    Cytuj | #3

    Kod:
    [self brain].neatResult = eglebegle;
    to to samo co
    Kod:
    [[self brain] setNeatResult:eglebegle];
    Gehu ma rację.
    Komputer: MacBook Pro 13,3" 2,26GHz (Lion 10.7.3)
    Telefon: iPhone 4S
    Tablet: iPad 2 3G
    dlaczego nie korzystasz z opcji szukaj?
    http://ifiboughtyourappalreadycaniup...acappstore.com


  4. Dołączył
    Dec 2007
    Skąd
    Gdynia
    Postów
    31

    Cytuj | #4

    To jest proste przekazanie parametru i z jego udziałem wypracowanie wyniku. Mogę co najwyżej zmienić to na "switch". Nie uważam to za kombinowanie. Dzięki za zwrócenie uwagi na literówkę, zapomniałem o tym.
    Cytat Napisał Roberto Zobacz post
    Kod:
    [self brain].neatResult = eglebegle;
    to to samo co
    Kod:
    [[self brain] setNeatResult:eglebegle];
    Gehu ma rację.
    Rozumiem, że chciałeś mi zwrócić uwagę na błąd polegający na ucięciu "set" w nazwie settera, w pliku "Brain.m" ?
    Komputer: iMac 20" 2,4ghz alu
    Telefon: iPhone 8gb 1.1.4
    Odtwarzacz: iPod Classic

  5. Avatar Roberto
    Dołączył
    Feb 2007
    Skąd
    Wrocław
    Postów
    11,859

    Cytuj | #5

    kombinowanie polega na tym, że robisz 'dziwnego' settera, tak 'intuicyjnie' patrząc. dlatego Gehu zaproponował, żebyś sobie napisał jakąś inną metodę (która będzie robić to samo, ale nie będzie 'setterem').

    chciałem ci zwrócić uwagę na to co powiedział Gehu - że nie napisałeś settera. dlatego, że nazwa metody jest 'zła' (niezgodna z wzorcem)

    walnij sobie NSLog'a w setterze to zobaczysz czy i kiedy jest używany, jeżeli w ogóle.
    Komputer: MacBook Pro 13,3" 2,26GHz (Lion 10.7.3)
    Telefon: iPhone 4S
    Tablet: iPad 2 3G
    dlaczego nie korzystasz z opcji szukaj?
    http://ifiboughtyourappalreadycaniup...acappstore.com


  6. Dołączył
    Nov 2010
    Postów
    8

    Cytuj | #6

    kombinowanie polega na tym, że robisz 'dziwnego' settera, tak 'intuicyjnie' patrząc
    Dokladnie o to chodzilo, bo to ze ustawiasz zmienna na podstawie wartosci innej jest normale.

    Wracjac to tematu proponuje zebyś sobie doczytal o properties. W objC i Cocoa jest tak przyjęte ze getter to nazwa zmiennej a setter to nazwa zmiennej pisana z dużej litery poprzedzona prefixem set. Wedlug tej konwecji synthezize generuje te metody dlatego chcąc ją nadpisać musisz zastować się do tego wzoru. Jak byś nie stosował synthezize i properties to wtedy mozesz zostawić swoją wersje settera i wszystko bedzie działało

  7. Avatar Roberto
    Dołączył
    Feb 2007
    Skąd
    Wrocław
    Postów
    11,859

    Cytuj | #7

    Gehu - nie wszystko.
    Kod:
    foo.bar = eglebegle;
    nie zadziała jeżeli nie ma metody setBar w klasie obiektu foo.
    notacja 'kropkowa' to to samo co używanie setterów i getterów w końcu, tylko zapis inny, a te muszą mieć określone nazwy żeby tutaj działały.

    dlatego zrobienie czegoś takiego w setterze
    Kod:
    - (void) setBar:(int)newBar
    {
    this.bar = newBar;
    }
    to bardzo głupi pomysł

    tutaj jest wspaniała hermetyzacja ;] dostęp do zmiennych tylko przez settery i gettery

    (btw. nie twierdzę, że tego nie wiesz, czy nie zdajesz sobie sprawy. tak się produkuję dla potencjalnych innych ;])
    Ostatnio edytowane przez Roberto ; 18.01.2011 o 23:12
    Komputer: MacBook Pro 13,3" 2,26GHz (Lion 10.7.3)
    Telefon: iPhone 4S
    Tablet: iPad 2 3G
    dlaczego nie korzystasz z opcji szukaj?
    http://ifiboughtyourappalreadycaniup...acappstore.com

  8. Avatar wezuwiusz
    Dołączył
    Feb 2008
    Skąd
    Dublin, Katowice
    Postów
    783

    Cytuj | #8

    Cytat Napisał xawoger Zobacz post
    [ciach...] "passing argument 1 of 'setNeatResult:' makes integer from pointer without a cast' " [...].
    taki komunikat pojawia Ci sie gdy prubujesz wstawic np. string jako NSNumber, albo int jako NSNumber lub odwrotnie. parametr ktory przekazujesz musi byc takiego samego typu jaki jest oczekiwany. czyli jezeli oczekiwany jest NSNumber a Ty masz int to musisz zastosowac [NSNumber numberWithInt:wartoscInt] itp...
    Komputer:  iMac 27"  iPhone4  iPad tv² +
    WWW: http://www.tridrops.com
    ____________________________/"'\,,, WezUwiUsz_
    Moja strona na FB
    Moje aplikacje: Easy Cash, Dock Clock, Flat Cube, Crazy Emoji


  9. Dołączył
    Nov 2010
    Postów
    8

    Cytuj | #9

    Roberto - masz racje. Moja wina bo źle się wyraziłem. Pisząc wszystko miałem na myśli ustawienie zmiennej w taki sposób jak chce to zrobić xawoger, ale oczywście nie może stosować notacji z kropka.


  10. Dołączył
    Dec 2007
    Skąd
    Gdynia
    Postów
    31

    Dzięki za wyczerpującą odpowiedz. Tak jak napisaliście po zastosowaniu synthesize, setter oczekuje że przekazany parametr będzie miał ten sam typ danych co getter. Generalnie można tradycyjnie samemu napisać własnego "settera" i "gettera" wtedy wszystko się zgadza, albo napisać metodę która zwróci wynik. Jeszcze raz dzięki.
    Ostatnio edytowane przez xawoger ; 19.01.2011 o 00:45
    Komputer: iMac 20" 2,4ghz alu
    Telefon: iPhone 8gb 1.1.4
    Odtwarzacz: iPod Classic

Odpowiedz na ten temat