Introductie Medische Apps Ontwikkelen

Deze tweedaagse workshop heeft tot doel de deelnemers een introductie te bieden voor het programmeren en bouwen van medische apps voor iOS. Als technisch platform gebruiken we XCode versie 7 en als programmeertaal Swift versie 2. Er is geen specifieke voorkennis vereist, wel wordt verondersteld dat deelnemers basisvaardigheden met computers hebben. Om te kunnen ontwikkelen voor iOS moet gewerkt worden op een Apple computer met Mac OS X. Deze worden tijdens de workshop voorzien.

De workshop wordt gegeven door Pieter Kubben, neurochirurg en zelf ervaren app-ontwikkelaar. Meer informatie en contact-gegevens vind je op mijn weblog DigitalNeurosurgeon.com.

Introductie ontwikkelomgeving en basis programmeren in Swift

Hier begint het ochtend-deel voor de eerste dag. Het doel is om de ontwikkelomgeving XCode te leren kennen en een begin te maken met programmeren.

XCode en Playgrounds

XCode is de ontwikkelomgeving waarin software geschreven wordt voor Mac OS X, iOS, watchOS en tvOS. OS staat voor Operating System (NL: besturingssysteem), dus de software die een computer bestuurt. Of die computer nu op je bureau staat, door jou wordt vastgehouden, om je pols zit of aan je televisie hangt, maakt niet uit. Binnen een besturingssysteem kunnen software-toepassingen draaien (ook wel applicaties, of specifiek op de mobiele platforms “apps” genoemd). Deze worden gebouwd in een programmeertaal.

Programmeren is het geven van eenduidige instructies aan een computer. Die instructies moeten aan bepaalde regels voldoen om door de computer begrepen te worden.

Er zijn veel verschillende programmeertalen beschikbaar. Om apps te bouwen binnen XCode was tot vorig jaar alleen Objective-C beschikbaar, maar nu is er gelukkig Swift. Deze taal is eenvoudiger, minder foutgevoelig, en nog sneller ook. Deze taal gaan we dan ook gebruiken binnen deze workshop, maar eerst gaan we kijken naar XCode. Je ziet (waarschijnlijk beneden) in je scherm een rij icoontjes staan, zoek daarin het volgende icoon en klik daarop:

XCode icon

XCode start op , maar er lijkt niets te gebeuren. Dat klopt. Het programma draait, maar er is nog geen document of project geopend. We gaan eenvoudig beginnen, en daarvoor maken we een Playground aan. Dit is een code-venster waarin code direct wordt uitgevoerd, en dit is daardoor ideaal om te beginnen met programmeren. Meer heb je nu niet nodig!

Klik boven in beeld, naast het vetgedrukte XCode, op File, New en Playground. Het volgende venster verschijnt:

Create playground

Je kunt zelf een naam kiezen (ik koos Playground01) en op de knop Next klikken. Als platform staat standaard iOS geselecteerd en dat laten we zo. In het volgende scherm kun je het bestand opslaan door een lokatie te kiezen en op Create te klikken. Daarna opent zich een “lege” playground:

Empty playground

Je ziet drie regels:

  1. een groenkleurige regel met een dubbele forward slash (//) aan het begin
  2. import UIKit
  3. var str = "Hello, playground"

De eerste regel is zogenoemd “commentaar”. Als je opmerkingen in je code wil plaatsen, gewone tekst die geen programmeercode is, moet je XCode laten weten dat hij deze regels mag negeren. Doe je dat niet, dan krijg je een foutmelding. In veel talen, en ook Swift, maak je een regel commentaar door te beginnen met //.

De tweede en derde regel zijn daadwerkelijke code die door de computer begrepen kunnen worden. Het import statement hebben we nu nog niet nodig, maar vertelt de computer dat een bepaald pakketje opgehaald dient te worden. Je kunt er // voorzetten, of de cursor op de regel zetten en de toetsencombinatie Cmd + / gebruiken, om er commentaar van te maken. De derde regel werkt dan nog steeds.

Wat betekent var str = "Hello, playground" nu eigenlijk? Wat staat hier? In normaal Nederlands gezegd het volgende: er komt dadelijk een variabele (var) met de naam str waarvan de waarde gelijk is (=) aan de tekst Hello, playground. Als de waarde van een variabele een tekst is, staat dat in Swift tussen dubbele aanhalingstekens ("..."). De kleuren die je ziet, betekenen niets voor de computer. Die zijn er alleen om het jou gemakkelijk te maken. Probeer maar eens om het laatste " te verwijderen: het werkt niet meer, en dat merk je al aan de kleur (en uiteraard aan het uitroepteken in het rode bolletje voor die regel). Om dit soort redenen wil je software ontwikkelen in een programma dat daarvoor bedoeld is. Je krijgt hulp, en dat werkt wel zo prettig. Via Edit, Undo kun je je fout ongedaan maken, of door de toetsencombinatie Cmd + Z.

Programmeren: de essentie

Voor we zelf programmacode gaan ingeven, eerst een korte achtergrond over programmeren. Ik heb al uitgelegd wat het is, maar wil nog iets van de mystiek rond het onderwerp verwijderen voor we aan de slag gaan.

In essentie werken we met gegevens, en die kunnen veel vormen aannemen. Denk aan tekst en getallen, maar ook afbeeldingen, geluid, metingen van sensoren, en noem maar op. Al die gegevens, los van welke vorm ze aannemen, noem ik data. En met die data kunnen we drie dingen doen:

  1. data input
  2. data manipulatie
  3. data output

Data input is het binnenhalen van de data. Dat kan vanaf een lokaal opslagmedium (harde schijf, usb stick, CD) of een opslagmedium elders (denk aan online servers). Maar ook touch gegevens op een scherm, invoer van een pen, een fingerprint scanner, camera, etc. Data output is het wegschrijven van de data. Dat kunnen de zojuist genoemde opslagmedia zijn, maar ook iets weergeven op een scherm, of b.v. een robot-arm aansturen. Data manipulatie is het bewerken van de data, en hierin onderscheid een computer zich van een leesboek of e-reader: er is interactiviteit mogelijk, de data kunnen worden bewerkt. Daar kunnen we ook in de zorg veel voordeel van hebben!

Data manipulatie kan wederom in drie vormen:

En heel grof gezegd: that’s it! Dat is programmeren in een notendop. Now let’s get started!

Variabelen

De term variabele is al eens voorbij gekomen, en eigenlijk spreekt de term voor zichzelf. Een variabele kan een waarde bevatten die variabel is, ofwel een waarde die kan wijzigen na de eerste invoer. Daar tegenover staat een constante die, je raadt het al, een waarde bevat die niet kan wijzigen na de eerste invoer. Swift gebruikt de sleutelwoorden (EN: keywords) var en let om een variabele resp. een constante aan te duiden.

Waarom is het verschil relevant? Waarom niet alles variabel maken en daarna zien of de waarde gewijzigd wordt? Omdat een constante fijner werkt voor de computer en jouw programma daardoor sneller draait. Bij een variabele moet de computer rekening ermee houden dat de nieuwe waarde wellicht meer geheugenruimte inneemt dan de oude waarde. Bij een constante is dat niet het geval, en deze is daarom meer memory efficient. De tip is dus:

Gebruik een constante waar dat kan. Gebruik een variabele alleen als dat nodig is.

Oké, genoeg gepraat, aan de slag! Wis alle inhoud uit je playground: dat mag met de muis, maar Cmd + A werkt ook voor een vlotte selectie alvorens je op Backspace duwt (rechtsboven op je toetsenbord). Typ nu het volgende:

// Mijn eerste code
let welcome = "Hello there!"

Sorry? Overtypen? Waarom geen copy & paste?

Je leert het snelste programmeren door de code zelf in te typen. Daarom zit je in je eentje achter de computer, en typ je de code letter voor letter zelf in. Ik ben eigenwijs (geweest) en heb het anders geprobeerd in het verleden. Been there, done that. Does not work.

Je mag overigens best een blanco regel invoegen tussen beiden als je dat prettiger vindt. Leesbaarheid van code is uitermate belangrijk!!!

In een playground wordt de waarde van de constante (of variabele) direct weergegeven rechts in beeld. Maar als we straks apps gaan bouwen, moeten we ergens melden wat we willen doen. Voeg de volgende regel toe:

print(welcome)

Je ziet nu een vergelijkbaar resultaat. Die \n aan het eind mag je negeren, het betekent dat de functie print() automatisch een nieuwe regel toevoegt.

Probeer nu eens een nieuwe waarde te geven aan de constante met de naam welcome door een nieuwe regel te typen:

welcome = "Another hi from here"

Foutmelding! Als je op het rode bolletje vooraan de regel klikt, zie je dit:

Constant error

En hier is XCode weer super, die legt uit wat er mis gaat en suggereert gelijk een oplossing! De eerste regel is de foutmelding, de tweede regel is de suggestie. Als je daarop dubbelklikt, is je probleem verholpen! Het gaat niet altijd zo eenvoudig, maar de XCode debugger (waar dit een onderdeel van is) is enorm handig! Op Facebook zou ik zeggen: Like :-)

Een persoonlijk welkom

We gaan onze code iets persoonlijker maken. Wis alles uit je playground en typ (!) het volgende:

// Persoonlijk welkom

var mijnNaam = "..."    // vul op de puntjes je naam in

print ("Welkom \(mijnNaam)")

Wat er gebeurt, zie je op het scherm. De variabele heet mijnNaam, daaraan kunnen je twee dingen opvallen:

  1. De ontwikkelomgeving is Engelstalig, de variabele Nederlandstalig. Het zal de computer een zorg wezen… er zijn wel wat eisen (je mag bv niet beginnen met een cijfer en er mogen geen rare tekens inzitten) maar verder ga je je gang maar. Zorg er wel voor dat je een logische naam kiest zodat je een half jaar later ook nog snapt wat je bedoelde. Dus mijnNaam is beter dan mn in deze.
  2. Ik schrijf mijnNaam en niet mijn naam, MijnNaam of mijn_naam. De notatie heet camel-case notatie (dat dier ja, goed geraden) en is gebruikelijk binnen Swift en veel andere talen. De twee optie, met een spatie erin, levert een foutmelding op. De derde optie mag, maar voor variabelen of constanten begin je beter met een kleine letter (ik vermoei je nu niet met de uitleg). De laatste optie is ook prima, maar binnen Swift niet zo gebruikelijk.

Zelf heb ik de voorkeur om alle code, dus ook variabelen en constanten, Engelstalig te houden. De waarde kan Nederlands zijn, maar als ik een probleem heb en online hulp zoek, helpt het als anderen mijn code ook kunnen begrijpen.

Als je nu op een nieuwe regel weer mijnNaam begint te typen, zie je dat XCode je weer te hulp springt:

Persoonlijk welkom

Wat staat daar nou? String? Oeps… per ongeluk verkeerde site geopend? Nee hoor, wees gerust… datgene wat ik tot nu toe een tekstwaarde noemde, noemt de computer een string value. Nu snap je ook waarom de variabele in de allereerste playground str heette. Wat XCode je hier aangeeft, is dat het een waarde van het type String kent, aangeduid als mijnNaam. Als je op Tab of Enter drukt, kun je deze selecteren en jezelf wat typen besparen. Maakt voor die paar letters niet uit, maar stel dat je mijnUniekeEnGeweldigeNaam had gekozen voor je variabele, dan ben je nu dankbaar. Je kunt zo een nieuwe waarde aan je variabele geven en ’m hergebruiken. Voeg deze twee regels toe aan de playground:

mijnNaam = "Sjeng"
print ("Een echte Maastrichtenaar heet \(mijnNaam)")

Het keyword var heb je alleen nodig als je de variabele declareert, ofwel aanmaakt. Daarna mag je ’m aanroepen met de naam alleen. Gelukkig… stel je voor dat ik jou zou willen roepen en telkens opnieuw de geboorte-aangifte moest doen daarvoor. Het zou wat worden.

Nog even over die print() regel: print is de naam van een functie en behalve een naam heeft een functie nog eventuele input variabelen die dan tussen () staan. De functie print wil als input graag hetgeen op het scherm afgedrukt moet worden. Als je nu een variabele wilt combineren met nog andere tekst, kun je de naam van de variabele tussen \() zetten zoals in het voorbeeld boven. Dan wordt de waarde automatisch ingevuld. Of je een spatie plaatst tussen de naam van de functie en de haakjes, mag je kiezen. Ik vind spaties de leesbaarheid bevorderen, daarom gebruik ik ze graag.

Getallen

We kunnen natuurlijk ook met getallen werken, en daarop wat rekenwerk loslaten. Let’s go! Wis de inhoud van de playground en typ:

// Rekensommetjes

let one = 1
let two = 2

print (one + two)
print (3 + 4)   // dit werkt ook 
5 * 7   // zonder print() werkt alleen in een playground

So far so good… en nu dan eindelijk een voorbeeld dat in de buurt komt van een medische app. Want daar ging deze workshop toch over? Wis de playground maar en typ:

// BMI calculator
let gewicht = 80.0  // in kg
let lengte = 1.80   // in m
let bmi = gewicht / (lengte * lengte)
print ("Uw Body Mass Index is: \(bmi)")

De haakjes hoef ik niet uit te leggen, toch? Iets met Meneer Van Dalen… ik wil er niet eens over nadenken, met de haakjes weet ik zeker dat het goed gaat. Haal ze maar weg, wordt een heel andere uitkomst.

Probeer nu eens om 80.0 te vervangen door 80. En? Foutmelding?

Tekst is van het type String. Getallen kunnen meerdere typen hebben. Een Integer is een heel getal, een Double heeft decimalen. Als je decimalen nodig hebt in de uitkomst, kun je het best zorgen dat de input dat ook is. 80 is een Integer, 80.0 een Double. En waar kun je problemen beter aanpakken dan bij de bron?

Je ziet dat ik achter de constanten een stukje commentaar heb geplaatst om te weten in welke eenheid de invoer is. Dat werkt hier prima, maar in een groter programma ga ik die constante elders gebruiken en dan weet ik dat misschien niet meer. Om misverstanden te voorkomen, kun je de naamgeving uitbreiden:

// BMI verbeterde versie
let gewichtInKilogram = 80.0
let lengteInMeters = 1.8
let bodyMassIndex = gewichtInKilogram / (lengteInMeters * lengteInMeters)
print ("Uw Body Mass Index is: \(bodyMassIndex)")

Handig he, die tab completion?

Boolean waarden

Wat voor waarden? Oh, juist / onjuist waarden. Zeg dat dan… Een Boolean is een parameter die maar twee waarden kan bevatten: true of false. En dat is handig voor besluitvorming… zullen we alvast een sneak preview doen voor het middagprogramma? Typ in een lege playground:

// Boolean demo
var fracturePresent = true

if fracturePresent {
    print("There is a fracture. I need to fix it.") 
}

Voor diegenen die het filmpje niet kennen…. kijken!