Mobile App Dev 2022W: Tutorial 2: Difference between revisions
Created page with "==Code== <syntaxhighlight lang="swift" line> // // ContentView.swift for textanalyzer-1 // // Created by Anil Somayaji on 2022-01-19. // import SwiftUI struct ContentView..." |
|||
(7 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
In this tutorial we'll be playing with <tt>textanalyzer-1</tt>, 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== | |||
* [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== | |||
# 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 "Pets Mentioned" that counts how many of the words "Shift", "Tab" or "Roshi" (or any other pets you like) appears in the text. Multiple occurrences of the same pet should only be counted once. Define this using a named function "countPetsMentioned". (Hint: try the string "contains" method.) | |||
==Code== | ==Code== | ||
[https://homeostasis.scs.carleton.ca/~soma/mad-2022w/code/textanalyzer-1/ContentView.swift ContentView.swift for textanalyzer-1] | |||
<syntaxhighlight lang="swift" line> | <syntaxhighlight lang="swift" line> | ||
Line 33: | Line 61: | ||
mode in | mode in | ||
Button(mode, action: { | Button(mode, action: { | ||
analysisMode = mode | analysisMode = mode | ||
}) | }) | ||
} | } | ||
Line 42: | 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 | ||
} | } | ||
} | } |
Latest revision as of 06:11, 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 "Pets Mentioned" that counts how many of the words "Shift", "Tab" or "Roshi" (or any other pets you like) appears in the text. Multiple occurrences of the same pet should only be counted once. Define this using a named function "countPetsMentioned". (Hint: try the string "contains" method.)
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()
}
}