Mobile App Dev 2022W: Tutorial 2: Difference between revisions
| No edit summary | |||
| Line 7: | Line 7: | ||
| First, create a multiplatform app called "textanalyzer-1".  Replace the contents of ContentView.swift with the code below. | First, create a multiplatform app called "textanalyzer-1".  Replace the contents of ContentView.swift with the code below. | ||
| == | ==Questions== | ||
| # This code defines two views.  What are they?  How are they connected to each other? | # This code defines two views.  What are they?  How are they connected to each other? | ||
Revision as of 05:35, 19 January 2022
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
- This code defines two views. What are they? How are they connected to each other?
- What kind of data structure is analysis? What data does it contain?
- 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()
    }
}