iT邦幫忙

2022 iThome 鐵人賽

DAY 25
0
Mobile Development

使用 SwiftUI 讓有趣的點子變成 Apps系列 第 25

D25 - 使用 SwiftUI 讓有趣的點子變成 Apps{無限猴子打字機: 開始比對文字}

  • 分享至 

  • xImage
  •  

接下來,就是比對文字的環節。而這一部分在這個專案上,我必須修改規則,假設我們的目標是兩個英文字,像是 he, ET, XO, KO,那所有集合是 676。而三個字母像 she, the, dog, cat 則集合為 17576。我實際跑了三個字母的目標,在一分鐘猴子打出來的字,都沒有符合,因為總組合數已經破萬,所以必須更改規則,才能在有限的時間內看到結果。

更改的規則如下:

  • 使用者輸入一段話,去掉空白,不管大小寫
  • 假設使用者目標為 Hello world,去掉空白和不管大小寫後,目標為 helloworld
  • 在猴子不斷敲打的鍵盤中,如果打中了 “h”,就視為第一個字母符合。接下來目標為第二字母 “e”,直到最後一個字母 “d” 被打山,則這一回合結束

加上這些宣告

/// 不管空格
  private var trimmedTarget: String {
      targetText.replacingOccurrences(of: " ", with: "")
  }
  /// 現在要打出來的「字母」index
  @State private var currentTargetIndex = 0
  /// 現在要打的「字母」
  private var targetCharacter: String? {
    /// 先簡化題目,不管大小寫
    let characters = Array(trimmedTarget.lowercased())
    
      if characters.indices.contains(currentTargetIndex) {
          return String(characters[currentTargetIndex])
      }
      
      return nil
  }

加上比對是否成功

private func match(character: String) -> Bool {
    
    guard let targetCharacter = targetCharacter else {
      return false
    }
    
    return character.contains(targetCharacter)
  }

加上 updateLog

private func updateLog(_ string: String) {
    let typingLog = TypingLog(typedString: string)
    logs.insert(typingLog, at: 0)
  }

把上述邏輯放進 timer 的 sink 就完成了

/// 猴子開始打字囉
  private func askMonkeysTyping() {
    
    typingTimer = Timer.publish(every: 0.1, on: .main, in: .common)
      .autoconnect()
      .sink { _ in
        let typedCharacter = createRandomString()
        print("發動產生文字: \(typedCharacter)")
        // 如果想和 console 一樣,最新的在最下面,就用 append()
        let typingLog = TypingLog(typedString: typedCharacter)
        logs.insert(typingLog, at: 0)
        if match(character: typedCharacter) {
            updateLog("\n成功比對: \(typedCharacter)\n")
            currentTargetIndex += 1
        }
      }
  }

然後,就可以開始檢查是不是正確的比對

https://ithelp.ithome.com.tw/upload/images/20220925/20140622tzhuf1KRay.png


上一篇
D24 - 使用 SwiftUI 讓有趣的點子變成 Apps{無限猴子打字機: 為什麼 id 重複了?}
下一篇
D26 - 使用 SwiftUI 讓有趣的點子變成 Apps{無限猴子打字機: 讓猴子停手}
系列文
使用 SwiftUI 讓有趣的點子變成 Apps30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言