Mobile App Dev 2022W: Tutorial 2: Difference between revisions
| No edit summary | |||
| Line 6: | Line 6: | ||
| 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. | ||
| ==Resources== | |||
| * [https://docs.swift.org/swift-book/LanguageGuide/StringsAndCharacters.html Swift: Strings and Characters] | |||
| * [https://docs.swift.org/swift-book/LanguageGuide/Functions.html Swift: Functions] | |||
| * [https://docs.swift.org/swift-book/LanguageGuide/Closures.html Swift: Closures] | |||
| * [https://developer.apple.com/documentation/swiftui/foreach SwiftUI: ForEach] | |||
| ==Questions== | ==Questions== | ||
Revision as of 05:48, 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.
Resources
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?
- How does countUpper figure out whether a character is upper case or not?
Tasks
- Move the analysis menu to the top of the screen.
- Add a menu option "Empty" that returns "Yes" or "No" based on whether the input string is empty or not. Define it using a closure/anonymous function.
- Add a menu option "Pet Mentions" that counts the number of occurrences of the words "Shift", "Tab" or "Roshi", or any other pets you like. Define this using a named function "countPets".
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()
    }
}