Hopp til hovedinnhold

Er du lei av tungvint apputvikling som stjeler all fritiden din? Det er på tide å ta i bruk SwiftUI!

I denne artikkelen skal jeg fremheve fordelene med å lage ditt neste hobbyprosjekt i SwiftUI. Forhåpentligvis sitter du igjen med kunnskap om når du bør bruke SwiftUI, og oversikt over hvilke tilfeller hvor det ikke passer seg like godt. Selv om jeg i denne artikkelen tar utgangspunkt i hobbyprosjekter, så gjelder mange av argumentene også for større prosjekter.

SwiftUI er et rammeverk laget av Apple for å lage native apper i Apple-økosystemet. Du kan hverken lage Android-apper eller nettsider med SwiftUI, men til gjengjeld er det skapt for å lage så gode som mulig løsninger til iPhone, iPad, Mac, Apple Watch, og resten av Apple-økosystemet. SwiftUI ble først annonsert i 2019, og har siden det fått store årlige oppdateringer fra Apple. Det vil si at SwiftUI gir deg en moderne utvikleropplevelse med stadig nye features som lar deg utnytte Apple-enheter på beste mulig måte.

Bør du lage app?

Hvis du har et hobbyprosjekt der det er mest naturlig å bruke mobil, så gir det mest mening å lage en app for å få den beste brukeropplevelsen. Du kan alltids lage en responsiv web-app, men da må du jobbe mot Apples mål om å drepe PWA-er. I tillegg krever det mye arbeid for å replisere alle de digge animasjonene og den gjennomarbeidede brukeropplevelsen du får i en app.

Kan jeg foreslå en native iOS-app og etterhvert en web-app til Android og PC?

Du bør bruke SwiftUI i hobbyprosjektet ditt

Det er mange Flutter-fanboys og React Native-nerds som kommer til å prøve å overtale deg til å skrive kryssplattform, men som en Swift-særing skal jeg gi deg 4 gode grunner til at du bør bruke native, og nærmere bestemt SwiftUI, til ditt neste hobbyprosjekt.

Du har lyst til å virkeliggjøre ideen din raskt

En stor fordel med å begrense seg til å utvikle til iPhones er at de alltid har relativt like dimensjoner, og du slipper dermed å tenke så mye på å lage et responsivt brukergrensesnitt. Ikke bare det, men SwiftUI lar deg bygge opp grensesnitt i rekordfart. Se for eksempel på denne enkle handleliste-appen jeg lagde i SwiftUI.

Demo av hvordan koden ser ut i praksis
Demo av hvordan koden ser ut i praksis

For en app som ser grei ut med animasjoner og mesteparten av funksjonaliteten som du forventer fra en handleliste-app, så er det ikke mer kode enn dette som skal til:

struct ShoppingListItem: Identifiable {
    let id: UUID = UUID()
    let created: Date = .now
    var text: String
    var checked: Bool = false
}

struct ContentView: View {
    @State private var shoppingList: [ShoppingListItem] =
      Utils.shoppingListExample.sorted { $0.created < $1.created }
    @State private var showAddSheet: Bool = false
    @State private var searchString: String = ""
    @State private var addItemText: String = ""
    
    func addItem(text: String) {
        shoppingList.append(ShoppingListItem(text: text))
        showAddSheet = false
    }
    
    func deleteItem(_ item: ShoppingListItem) {
        shoppingList.removeAll { $0.id == item.id }
    }
    
    var body: some View {
        let filteredShoppingList = shoppingList.filter {
            // localizedCaseInsensitiveContains er en contains som for eksempel ikke skiller mellom a og å, som typisk kan være praktisk i et søkefelt
            searchString.isEmpty || $0.text.localizedCaseInsensitiveContains(searchString)
        }
        
        NavigationStack {
            List {
                ForEach(filteredShoppingList.filter { $0.checked == false }) { listItem in
                    ShoppingListItemView(listItem: listItem, deleteItem: deleteItem)
                }
                ForEach(filteredShoppingList.filter { $0.checked == true }) { listItem in
                    ShoppingListItemView(listItem: listItem, deleteItem: deleteItem)
                }
            }
            .searchable(text: $searchString) // Alt man trenger for å få et søkefelt som automatisk oppdaterer searchString-staten
            .navigationTitle("Handleliste")
            .toolbar { // Knapper ovenfor overskriften på siden
                ToolbarItem {
                    Button(action: { showAddSheet = true }) {
                        Image(systemName: "plus")
                    }
                }
            }
            .sheet(isPresented: $showAddSheet) {
                List {
                    HStack {
                        TextField("Enter item name", text: $addItemText)
                        Button(action: { addItem(text: addItemText) }) {
                            Text("Add")
                        }.disabled(addItemText.isEmpty)
                    }
                }
                .presentationDetents([.fraction(0.2)]) // Størrelsen på sheetet
            }
        }
    }
}

struct ShoppingListItemView: View {
    let listItem: ShoppingListItem
    let deleteItem: (ShoppingListItem) -> Void
    
    var body: some View {
        Button(action: {
            withAnimation { // Animerer alle endringene som skjer innenfor denne
                listItem.checked.toggle() // Bytter mellom true og false
            }
        }) {
            HStack {
                Image(systemName: listItem.checked ? "checkmark.circle.fill" :  "circle")
                    .foregroundStyle(listItem.checked ? .orange : .secondary)
                    .font(.title3)
                    .padding(.trailing, 5)
                Text(listItem.text)
                    .strikethrough(listItem.checked)
            }
        }
        .foregroundStyle(.primary)
    }
}

Visste du at med koden ovenfor, så har denne appen dark mode og fungerer fint til iPad, Apple Vision Pro(‼️) og Mac i tillegg til iPhone? SwiftUI gjør også mye annen magi for deg, for eksempel så plukker den automatisk opp de strengene som vises i grensesnittet ditt og legger det inn i en Localization-tabell, som du kan fylle ut for å enkelt få appen din i alle språkene du orker å oversette den til. Det betyr at SwiftUI gjør det superenkelt å få hobbyprosjektet ditt til å bli en internasjonal suksess!

Du har lyst til å lage en sjukt smud app

Hvis du drømmer om at appen din skal bli en suksess og nå så mange som mulig, så er det viktig å lage noe brukerne liker. Mange av de lavthengende fruktene er allerede laget, du må lage noe som funker bedre og som brukerne dine liker å bruke.

Så du at jeg brukte withAnimate når man huker av listeleementer i koden over, slik at de flytter seg opp og ned med en finfin animasjon? Så enkelt er det å få spreke animasjoner i SwiftUI. Og den nice animasjonen ved åpning av popupen som lar deg legge til et listeelement? Det kommer automatisk. Kombiner dette med litt Lottie-animasjoner, så kommer det ikke til å se ut som at appen din er designet av en utvikler.

Du har høye ambisjoner, og vil sikte deg inn på den viktigste markedsgruppen

La oss grave litt i tall, så skal du se hvorfor en iOS-app er mye mer lukrativ enn en Android-app. I Norge har iOS en markedsandel på 69.5%, kontra knappe 30% internasjonalt. Selv med den lave markedsandelen for iOS internasjonalt, så er allikevel drøye 65% av app-inntekter på iOS. Det betyr at en appbruker på iOS i snitt genererer deg 2.2 ganger så mye inntekt som en bruker på Android. Justert for markedsandelen på det norske markedet, så vil det si at det er 5 ganger så mye penger å tjene på iOS-apper kontra Android-apper i det norske markedet.

formel for utregning
Formel brukt for utregning av inntekten til iOS-apper kontra Android-apper

Selvfølgelig er det gjort en del forenklinger i beregningene, men tallenes tale er ganske klar her.

Du har lyst til å bli en dyktig app-utvikler

Du kommer deg ikke helt unna native iOS kode hvis du skal lage en app til iPhone. Enten så skriver du det selv gjennom SwiftUI eller UIKit, eller så bruker du et bibliotek som abstraherer bort native-koden. Plutselig ønsker du deg noe som ikke støttes av biblioteket du bruker, og du blir nødt til å lage din egen abstraksjon. Ved å lære deg SwiftUI så er du bedre rustet til å forstå hvordan Apple-økosystemet henger sammen, og hvordan du for eksempel kan få enda bedre ytelse i appen din. Med alle disse rammeverkene som bygger på SwiftUI, er det sannsynlig at det er en god investering i fremtiden å lære seg SwiftUI.

Når bør du unngå SwiftUI til bruk i hobbyprosjekt?

Selv om SwiftUI høres ut som gull og grønne skoger, så er det dessverre ikke en løsning i alle tilfeller. Denne seksjonen gir deg 3 tilfeller der du kanskje ikke burde bruke SwiftUI.

Appen din må være tilgjengelig på Android

Selv om du ikke kan bruke SwiftUI til å bygge Android-apper, så slår jeg et slag for at du kan skrive en app til Android senere, eller bare gi dem en web-app 🤷‍♂️

Du har ikke en Mac til utvikling

Hvis du ikke har en Mac tilgjengelig til å utvikle på, så kan du dessverre ikke utvikle en SwiftUI-app. Utvikling i SwiftUI krever at du har Xcode installert, og denne programvaren er kun tilgjengelig på Mac. Det skal sies at du vil få problemer om du skal lage en iPhone-app uten en Mac selv om du bruker rammeverker som React Native og Flutter også, men det er omtrent umulig ved utvikling i SwiftUI.

Du må ha en app som ser helt lik ut på alle enheter

Hvis du ønsker at appen din ser identisk ut på iOS og Android, så vil du sannsynligvis komme bedre ut av å bruke et kryssplatform-rammeverk som for eksempel Flutter. Dette er gjerne et krav som oftere dukker opp i offentlig sektor eller i veldig store selskaper, og sjelden i hobbyprosjekter. Hvis det allikevel gjelder for ditt hobbyprosjekt, så vil du nok komme best ut av å lage applikasjonen din i en felles kodebase.

Det samme gjelder hvis du vil ha et veldig spesifikt design, ettersom du da ofte ikke får benyttet deg av den native stylingen i SwiftUI som lar deg spare deg for mye tid.

Bestemt deg?

Nå vet du forhåpentligvis litt mer om hva du får hvis du velger å utvikle i SwiftUI. Jeg håper også du har fått litt ekstra motivasjon til å bruke julen til å utvikle den fantastiske ideen du sitter med.

God jul!

Liker du innlegget?

Del gjerne med kollegaer og venner