Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  17 1928
Hei!

Jeg har hundrevis av integere som heter t1, t2, t3, t4, t5, t6, t7 osv...

De har alle hver sin verdi:

t1=1; t2=5; t3=8; t4=3; t5=1; t6=2; t7=2; osv...

Og så har jeg en integer x og en integer y.

Integer x skal så få en ny verdi, avhengig av hva y er.

Jeg klarer det bare på denne måten:

Kode

if (y==1){x=t1;}
if (y==2){x=t2;}
if (y==3){x=t3;}
if (y==4){x=t4;}
if (y==5){x=t5;}
osv...

Hvordan kan jeg skrive dette enklere?

Jeg bruker Xcode og objective c.

Jeg får nemlig mange slike lange rekker i appen min hvis jeg ikke finner en enklere måte å skrive det på. Vet ikke helt hva jeg skal google heller for å finne det...
Sist endret av hinsidige; 15. april 2019 kl. 20:26. Grunn: Glemte noe
Dette lukter som et XY problem. Mye mulig dette kan løses på en annen måte, men da må du gi litt mer innsikt i problemstillingen din.
Sist endret av Patrick; 15. april 2019 kl. 20:27.
Trigonoceps occipita
vidarlo's Avatar
Donor
Ein tanke er jo eit array over x-verdier, slik at array[y] returnerer rett verdi. Men som Patrick er inne på lukter det av XY-problem. Kva er føremålet med substitusjonen?
hinsidige's Avatar
Trådstarter
Altså:

Takk for raske svar, her er litt mer info:

Dette er en app som spiller sanger, har et piano-keyboard, og nå skal jeg legge til fargekoder som viser hvilke tangenter du skal trykke på for å spille de ulike sangene. I stedet for noter altså. Fargene skal skli nedover mot tangentene. Lange toner skal være en lang dings, og korte toner skal være en kort dings. Jeg vet at det finnes mange slike apper, men jeg vil likevel lage en selv.

"Lisa gikk til skolen" har dermed disse data:

if (sangNr==23){
t1=1; t2=2; t3=3; t4=4; t5=5; t6=5; t7=6; t8=6; t9=6; t10=6; t11=5; t12=4; t13=4; t14=4; t15=4; t16=3; t17=3; t18=2; t19=2; t20=2;
v1=12; v2=12; v3=12; v4=12; v5=24; v6=24; v7=12; v8=12; v9=12; v10=12; v11=48; v12=12; v13=12; v14=12; v15=12; v16=24; v17=24; v18=12; v19=12; v20=12;

t21=2; t22=1; t23=0;
v21=12; v22=48;
}

T-verdiene er tonene, v-verdiene er den tilhørige varigheten av tonen.

Jeg får appen til å spille sangene ved hjelp av AV-player, pianoet funker også.

Og nå skal altså formelen hente alle t-verdiene og v-verdiene for å lage fargekoder til den som skal spille selv:

For den første tonen skal altså et image vises over tangent C og imaget skal være ha lengden 12, siden v2=12. Den neste tonen skal få et image over tangenten D, og det skal også ha lengden 12, siden v2 også er 12.

Hvis jeg da får hentet verdiene suksessivt som forklart over kan jeg legge de inn i en loop av denne typen:

for (int y = 1; y < maxToner+1; y++){
NSString *key1 = [NSString stringWithFormat:@"stav%d", y];
UIImageView *nyStav = [self valueForKey:key1];

int x = ??????????

Hit kom jeg altså...
Sist endret av hinsidige; 15. april 2019 kl. 21:23. Grunn: feil
Trigonoceps occipita
vidarlo's Avatar
Donor
Array vil funke. Om det er optimal løysing har eg ikkje peiling på.
hinsidige's Avatar
Trådstarter
Jeg er ikke god med array, og det er for sent for denne appen, regner jeg med. Siden jeg har lagt inn alle som integer. Er det ikke noen andre måter? Bare en formel som henter verdien, så er jeg i mål...
Bea
Big Bad Wolf
Bea's Avatar
Du kan fortsatt bruke et array, istedet for å lage alle verdiene dine som t1, t2, t3 osv,
lager du et array TANGENTER = [1, 2, 3, 4, 5, 6, 7]; og et array LENGDE = [3, 2, 3, 2, 1, 5]; etc.
Så kan du gjøre oppslag i de arrayene for å finne ut tangent og lengde ved TANGENTER[i], LENGDE[i].

Det hadde kanskje også gått ann å lage et eget objekt for hvert "note", men det blir en del mer avansert
hinsidige's Avatar
Trådstarter
OK, Bea, det kan jeg altså gjøre uten å måtte skrive om igjen alle dataene til sangene?

For det orker jeg ikke tanken på. Men arrayene kan altså hente dataene og gjøre de tilgjengelige, er det sånn det funker?

Jeg har aldri brukt array før, skjønner du...
Trigonoceps occipita
vidarlo's Avatar
Donor
Sitat av hinsidige Vis innlegg
OK, Bea, det kan jeg altså gjøre uten å måtte skrive om igjen alle dataene til sangene?

For det orker jeg ikke tanken på. Men arrayene kan altså hente dataene og gjøre de tilgjengelige, er det sånn det funker?

Jeg har aldri brukt array før, skjønner du...
Vis hele sitatet...
Du diller med programmering. Å konvertere data er jo trivielt med to linjer shellscript.

Men om du liker programmering er jo array eit sentralt element som du bør ha kontroll på.

I tillegg du bør du lukte på å skilje kode og data. Notane er data, og har ingenting i koden å gjere
hinsidige's Avatar
Trådstarter
Jeg har mye å lære, jeg vet det.

Jeg er selvlært og har bare lært meg noen sporadiske biter av koding. Når jeg er i Xcode har jeg ikke peiling på f.eks. hva noen av disse begrepene betyr: AppDelegate, Build Phases, Capabilities osv. Aner heller ikke hva shellscript er... Jeg får ta en ting av gangen, og skjønner at array er noe jeg kan dra nytte av.

Skjønner ikke hva du mener med å skille kode og data. Skal ikke verdiene for notene ligge i ViewController.m i Xcode? Hvor skal det ellers ligge? Det er jo der jeg skriver omtrent alt. I ViewController.h skriver jeg bare det lille jeg må for å innføre navn på nye knapper, bilder osv.
Trigonoceps occipita
vidarlo's Avatar
Donor
Nei, du kan skilje data ut. No kjenner ikkje e objective C, men generelt bør du skilje ut data som ekstern fil e.l., og lese den inn når programmet køyrer. Då er det enklare å utvide seinare.

Du kan t.d. lagre dei som ei liste av integers, og lese det inn i eit array når programmet køyrer.
hinsidige's Avatar
Trådstarter
OK, da får jeg sette meg inn i bruk av array, så finner jeg nok en løsning. Skjønner poenget ditt, vidarlo. Mange av de gamle appene mine er håpløse å finne fram i hvis jeg skal endre noe. Kode er blandet med store mengder data, slik at alt blir lite oversiktlig.

Men det enkleste for meg nå ville vært å kunne skrive noe slikt:

x = t (verdi #y);

men det går kanskje ikke...

Uansett, takk for alle innspill, som tross alt er konstruktive for meg på lang sikt.
Sist endret av hinsidige; 15. april 2019 kl. 22:27. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Trigonoceps occipita
vidarlo's Avatar
Donor
Array vil gi deg noko som er rimelig likt det. Generelt er array ei indeksert liste, der du kan slå opp verdien på eit bestemt element.

Gitt arrayaet a=[2, 4, 6, 8] vil a[0] slå opp 0. verdi, og altså returnere 2. a[3] vil slå opp 3. verdi, og altså returnere åtte. Tar eg ikkje heilt feil har Objective C 0-indekserte array, dvs. at teljaren starter på 0.

Du bør og sjå på for-løkker, som kombinert med array er enkel og kjapp måte å repetere ting på.
hinsidige's Avatar
Trådstarter
Den er grei. Da har jeg en plan. Array er neste leksjon for min del.

For-løkker kan jeg. Jeg skriver slik:

for (int y = 1; y < maxToner+1; y++){
// løkka mi
}

Da går den gjennom løkka mi med y-verdier fra 1 til maxToner.
si du har en kommaseparert liste med linjebrudd på slutten, slik:

Kode

1,2
6,1
7,1
8,1
osv,osv....
les hele filen inn i minne. Deretter splitter du opp hver enkelt linje i et array. Splitt deretter hvert element i arrayet etter komma, så sitter du igjen med et 2 dimensjonalt array, som ser litt mer slik ut (visuelt):

Kode

notes = [
  [1,2]
  [6,1],
  [7,1],
  [8,1],
];
deretter kjører du gjennom arrayet ditt som om det var en sang:

Kode

foreach(var note in notes) {
  let note = note[0];
  let length = note[1];
  play(note, length);
}
fordelen med denne løsningen blir jo at du ikke lenger har hardkodet sangene inn i koden din, og det blir enklere å legge til nye sanger, kun ved å legge til nye filer.

Obs. jeg har tatt utgangspunkt i at tX og vX begge hører sammen, men mulig jeg har misforstått deg her. Hvis du har flere noter som skal spilles samtidig, kan du jo bare gruppere dem sammen og splitte opp etter komma verdi videre. altså slik:

Kode

notes = [
  [1,2,3,4,8,12]
];
Nå har vel ikke alle sanger noter som varer like lenge, så her ville jeg løst det ved å splitte det opp i sine egne objekter, og behandle disse asynkront. Fordelen med denne løsningen er da at hver note nå har fått sin egen lengde, levetid og er helt uavhengig av andre noter som spilles på pianoet. Har dog dessverre ingen erfaring med asynkron programmering i objective C.
Sist endret av Patrick; 15. april 2019 kl. 22:45.
hinsidige's Avatar
Trådstarter
Takk, Patrick.

Nå fikk jeg enda mer å tenke på. Godt det er påske snart... tX og vX hører sammen ja. Men det blir en stor snuoperasjon hvis jeg skal skrive om alt nå til å bruke array. Jeg får heller ta det fra starten i neste prosjekt.
Trigonoceps occipita
vidarlo's Avatar
Donor
Sitat av hinsidige Vis innlegg
Nå fikk jeg enda mer å tenke på. Godt det er påske snart... tX og vX hører sammen ja. Men det blir en stor snuoperasjon hvis jeg skal skrive om alt nå til å bruke array. Jeg får heller ta det fra starten i neste prosjekt.
Vis hele sitatet...
Nei, det er neppe spesielt stor operasjon. Å skrive om det du har til array kan du løyse rimeleg kjapt med litt scripting.

Å gjere det no får at du får ting som er enklare å kode, og enklare å vedlikehalde. Å endre på det ein har gjort er ikkje uvesentleg del av programmering; å innsjå at en har gjort feil, og fikse det.
hinsidige's Avatar
Trådstarter
Ja, du har nok rett. Jeg har en lei tendens til å fortsette å gjøre tungvindt koding som jeg er trygg på, i stedet for å utvikle meg. Jeg innser det. Skal jobbe meg meg selv noen runder, så får vi se...