Mobile App Dev 2022W: Tutorial 2

From Soma-notes

This tutorial is still being developed.

In this tutorial we'll be playing with textanalyzer-1, a very simple app for analyzing text that shows off a number of features of Swift and SwiftUI.

Getting Started

First, create a multiplatform app called "textanalyzer-1". Replace the contents of ContentView.swift with the code below.

Questions

  1. This code defines two views. What are they? How are they connected to each other?
  2. What kind of data structure is analysis? What data does it contain?
  3. What is the difference between the ForEach and for-in constructs? Are they interchangeable?

Code

ContentView.swift for textanalyzer-1

//
//  ContentView.swift for textanalyzer-1
//
//  Created by Anil Somayaji on 2022-01-19.
//

import SwiftUI

struct ContentView: View {
    @State private var t = ""
    @State private var analysisMode = "Count"
    var body: some View {
        VStack{
            Text("Text Analyzer").bold().padding()
            TextField("Enter Text", text: $t).padding()
            Text(analysisMode + ": " + analysis[analysisMode]!(t)).padding()
            ModeMenu(analysisMode: $analysisMode)
        }
    }
}

struct ModeMenu: View {
    @Binding var analysisMode: String

    var body: some View {
        let availModes = [String](analysis.keys)

        Menu("Analysis menu") {
            ForEach(availModes, id: \.self) {
                mode in
                Button(mode, action: {
                    analysisMode = mode;
                })
            }
        }

    }
}

func countUpper(_ s: String) -> String {
    var count = 0;
    let upperCase: Set<Character> =
    ["A","B","C","D","E","F","G","H","I","J","K","L","M",
     "N","O","P","Q","R","S","T","U","V","W","X","Y","Z"];
    
    for c in s {
        if (upperCase.contains(c)) {
            count += 1;
        }
    }
    
    return String(count);
}

let analysis: [String: (String) -> String] = [
    "Count": {s in return String(s.count)},
    "Upper Case": countUpper
]

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}