Mobile App Dev 2022W: Tutorial 2: Difference between revisions
No edit summary |
|||
Line 61: | Line 61: | ||
mode in | mode in | ||
Button(mode, action: { | Button(mode, action: { | ||
analysisMode = mode | analysisMode = mode | ||
}) | }) | ||
} | } | ||
Line 70: | Line 70: | ||
func countUpper(_ s: String) -> String { | func countUpper(_ s: String) -> String { | ||
var count = 0 | var count = 0 | ||
let upperCase: Set<Character> = | let upperCase: Set<Character> = | ||
["A","B","C","D","E","F","G","H","I","J","K","L","M", | ["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"] | "N","O","P","Q","R","S","T","U","V","W","X","Y","Z"] | ||
for c in s { | for c in s { | ||
if (upperCase.contains(c)) { | if (upperCase.contains(c)) { | ||
count += 1 | count += 1 | ||
} | } | ||
} | } |
Revision as of 06:08, 19 January 2022
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()
}
}