Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

11. diel - Podmienky vo Swift druhýkrát - ternárne výraz a mocnejšie switch

V dnešnom Swift tutoriálu si predstavíme 2 ďalšie konštrukcie, ktoré súvisia s podmienkami. Ide o oddychovú lekciu, ktorú túto tému dokončíme.

Ternárne operátor

Často sa nám stáva, že niekde potrebujeme nastaviť 2 rôzne hodnoty podľa toho, či platia nejaké podmienka.

Príklad - Výpis pohlavia

Predstavme si, že máme napr. Pohlavia užívateľa uložené ako Bool (muž by bol true) a my by sme ho chceli previesť do textu. S doterajšími znalosťami by sme napísali asi takýto kód:

Klikni pre editáciu
  • let muz = true // nejaká premenná udávajúci pohlavia
    let nazevPohlavi: String
    if muz {
        nazevPohlavi = "muž"
    } else {
        nazevPohlavi = "žena"
    }
    
    print(nazevPohlavi)
    
    • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

    Výstup programu je samozrejme nasledovné:

    muž

    Kód je pomerne ukecaný na to, že len prepína medzi dvoma hodnotami. Preto programovacie jazyky často podporujú tzv. Ternárne výraz.

    Syntaxe ternárního výrazu

    Pomocou tohto operátora môžeme získať hodnotu podľa platnosti logického výrazu. Zapíšeme ho takto:

    výraz ? hodnota1 : hodnota2

    Podmienku vložíme väčšinou do zátvorky (), ak je zložitejšia, potom nasleduje otáznik ? a dve hodnoty, ktoré sa majú vrátiť. Hodnoty sú oddelené dvojbodkou :, prvá sa vráti keď podmienka platí a druhá keď neplatí. Ako ľahké!:) Názov operátora je odvodený od toho, že má 3 časti (podmienka, prvá hodnota a druhá hodnota), preto ternárne.

    Príklad - Použitie ternárního výrazu

    Poďme si ternárne operátor vyskúšať na príklade s pohlavím:

    Klikni pre editáciu
    • let muz = true
      let nazevPohlavi = muz ? "muž" : "žena"
      print(nazevPohlavi)
      
      • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

      Namiesto typu Bool by sme mohli samozrejme napísať akúkoľvek inú podmienku, napr. (vek >= 18) ? " plnoletý " : " maloletý ".

      Vnorovanie ternárne operátorov

      Ternárne operátormi možno teoreticky ponoriť do seba a tým reagovať aj na tri a viac hodnôt. Avšak vo väčšine prípadov ponáranie skôr kód znepřehlední, vznikajú totiž dlhé alebo podivne zalomené riadky a nie je na prvý pohľad vidieť, aká časť sa kedy spustí. Ukážme si, ako by sa pomocou vnorovanie ternárne výrazov vyriešil výpis troch pohlavia:

      Klikni pre editáciu
      • let pohlavi = "nevim"
        let nazevPohlavi = pohlavi == "muz" ? "muž" : pohlavi == "zena" ? "žena" : "nezname"
        print(nazevPohlavi)
        
        • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

        Pre príklad vyššie by bolo lepšie vytvoriť vlastnú metódu, čo si ale ukážeme až v nadväzujúcom kurze objektovo orientovaného programovania.

        Pokročilejšie switch

        S konštrukciou switch sme sa už stretli v lekcii Podmienky (vetvenia). Dnes si ukážeme jej ďalší použitie, ktoré nie je tak časté, ale môžete na neho naraziť. Akonáhle switch vykoná prvé case, tak sa jeho vykonávanie ukončí. Môžeme ale použiť špeciálne kľúčové slovo fallthrough a toto správanie upraviť.

        V jazykoch ako C dokonca switch automaticky "prepadáva", takže je nutné písať explicitne break do každej vetvy.

        Príklad - Štvrťrok

        Predpokladajme, že chceme podľa mesiaca v roku zistiť, aké je štvrťrok. Pomocou if a else by príklad vyzeral nasledovne:

        Klikni pre editáciu
        • let mesic = 2
          if mesic >= 1 && mesic <= 3 {
              print("Je prvý štvrťrok")
          } else if mesic >= 4 && mesic <= 6 {
              print("Je druhý štvrťrok")
          } else if mesic >= 7 && mesic <= 9 {
              print("Je tretí štvrťrok")
          } else if mesic >= 10 && mesic <= 12 {
              print("Je štvrtý štvrťrok")
          }
          
          • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

          Ako ale použiť switch pre takýto príklad? Možno by vás napadol nasledujúce zápis:

          Klikni pre editáciu
          • let mesic = 11
            switch mesic {
            case 1:
                print("Je prvý štvrťrok")
            case 2:
                print("Je prvý štvrťrok")
            case 3:
                print("Je prvý štvrťrok")
            case 4:
                print("Je druhý štvrťrok")
            case 5:
                print("Je druhý štvrťrok")
            case 6:
                print("Je druhý štvrťrok")
            case 7:
                print("Je tretí štvrťrok")
            case 8:
                print("Je tretí štvrťrok")
            case 9:
                print("Je tretí štvrťrok")
            case 10:
                print("Je štvrtý štvrťrok")
            case 11:
                print("Je štvrtý štvrťrok")
            case 12:
                print("Je štvrtý štvrťrok")
            default:
                break
            }
            
            • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

            Príklad funguje spoľahlivo, problém však je, že sme si týmto zápisom moc nepomohli. Podobnému repetitivnímu kódu by sme sa vždy mali vyhýbať.

            Definícia viac hodnôt a rozsahu case

            Jednotlivé case vo Swiftu môžu byť definované pre viac hodnôt. Napríklad case 1, 2, 3, ktorý sa vykoná, ak bude mať premenná jednu z týchto hodnôt.

            Ešte lepšie je potom možnosť využiť typ Range a použiť tento zápis: case 1...3. Mohli by sme zapísať tiež ako case 1..<4.

            Upravme náš príklad:

            Klikni pre editáciu
            • let mesic = 11
              switch mesic {
              case 1, 2, 3:
                  print("Je prvý štvrťrok")
              case 4...6:
                  print("Je druhý štvrťrok")
              case 7...9:
                  print("Je tretí štvrťrok")
              case 10...12:
                  print("Je štvrtý štvrťrok")
              default:
                  break
              }
              
              • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

              Ukážka výstupu aplikácie:

              Je štvrtý štvrťrok.

              Tento zápis je už oveľa prehľadnejšie. A pre podobné prípady sa dosť dobre hodí.

              Keby ste niečoho podobného chceli docieliť s if, tak je nutné použiť metódu contains() na inštanciu Range. Vyzeralo by to nejako takto:

              if (1...3).contains(mesic) {
                  print("Je první čtvrtletí")
              }

              Ako už sme si povedali, vo Swiftu nedochádza k automatickému prepadávaniu u case, takže do nich nemusíme písať break. Prepadnutie ale môžeme vynútiť pomocou kľúčového slova fallthrough. To spôsobí, že program "prepadne" na ďalší case, ktorý tiež vykoná, tu už je jedno, či je splnená podmienka. Zatiaľ som sa s fallthrough osobne nestretol, môžete sa hodiť napr., Keď by ste chceli vykonať default blok, prípade u pokročilejších konštrukcií, kde v rámci jedného case zachytávajú viac podmienok.

              V nasledujúcom cvičení, Riešené úlohy k 10.-11. lekciu Swift, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.


               

              Ako sa ti páči článok?
              Pred uložením hodnotenia, popíš prosím autorovi, čo je zleZnakov 0 z 50-500
              Predchádzajúci článok
              Viacrozmerné polia vo Swift
              Všetky články v sekcii
              Základné konštrukcie jazyka Swift
              Preskočiť článok
              (neodporúčame)
              Riešené úlohy k 10.-11. lekciu Swift
              Článok pre vás napísal Filip Němeček
              Avatar
              Užívateľské hodnotenie:
              Ešte nikto nehodnotil, buď prvý!
              Autor se věnuje vývoji iOS aplikací (občas macOS)
              Aktivity