Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import SwiftUI
- struct ContentView: View {
- @State private var usedWords = [String]()
- @State private var rootWord = ""
- @State private var newWord = ""
- @State private var errorTitle = ""
- @State private var errorMessage = ""
- @State private var showingError = false
- @State private var score = 0
- var body: some View {
- NavigationView{
- List{
- Section{
- TextField("Enter your word", text: $newWord)
- .autocapitalization(.none)
- }
- Section {
- ForEach(usedWords, id: \.self) { word in
- HStack{
- Image(systemName: "\(word.count).circle")
- Text(word)
- }
- }
- }
- Section{
- HStack{
- Spacer()
- Text("Your score: \(score)")
- Spacer()
- }
- }
- }
- .navigationTitle(rootWord)
- .onSubmit(addNewWord)
- .onAppear(perform: startGame)
- .alert(errorTitle, isPresented: $showingError) {
- Button("OK", role: .cancel) { }
- } message: {
- Text(errorMessage)
- }
- .toolbar {
- Button("Start new game") {
- startGame()
- usedWords.removeAll()
- score = 0
- }
- }
- }
- }
- func addNewWord() {
- let answer = newWord.lowercased().trimmingCharacters(in: .whitespacesAndNewlines)
- guard answer.count > 0 else { return }
- guard isOriginal(word: answer) else {
- wordError(title: "Word used already", message: "Be more original")
- return
- }
- guard isPossible(word: answer) else {
- wordError(title: "Word not possible", message: "You can't spell that word from '\(rootWord)'!")
- return
- }
- guard isReal(word: answer) else {
- wordError(title: "Word not recognized", message: "You can't just make them up")
- return
- }
- guard answer.count > 2 else {
- wordError(title: "Type more than 3 characters", message: "")
- return
- }
- guard answer != rootWord else {
- wordError(title: "Word is the same as root world", message: "You can't do that")
- return
- }
- withAnimation{
- usedWords.insert(answer, at: 0)
- }
- newWord = ""
- score += 1
- }
- func startGame() {
- if let startWordsURL = Bundle.main.url(forResource: "start", withExtension: "txt") {
- if let startWords = try? String(contentsOf: startWordsURL) {
- let allWords = startWords.components(separatedBy: "\n")
- rootWord = allWords.randomElement() ?? "silkworm"
- return
- }
- }
- fatalError("Could not load start.txt from bundle")
- }
- func isOriginal(word: String) -> Bool {
- !usedWords.contains(word)
- }
- func isPossible(word: String) -> Bool {
- var tempWord = rootWord
- for letter in word {
- if let pos = tempWord.firstIndex(of: letter) {
- tempWord.remove(at: pos)
- } else {
- return false
- }
- }
- return true
- }
- func isReal(word: String) -> Bool {
- let checker = UITextChecker()
- let range = NSRange(location: 0, length: word.utf16.count)
- let misspelledRange = checker.rangeOfMisspelledWord(in: word, range: range, startingAt: 0, wrap: false, language: "en")
- return misspelledRange.location == NSNotFound
- }
- func wordError(title: String, message: String) {
- errorTitle = title
- errorMessage = message
- showingError = true
- }
- }
- struct ContentView_Previews: PreviewProvider {
- static var previews: some View {
- ContentView()
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement