
이 코드는 사용자의 키보드 입력과 음성 인식(STT) 입력을 동시에 관리하는 바인딩을 구현한 것이다.
텍스트 변경이 키보드에 의한 것인지 음성 인식에 의한 것인지 구분하여 적절히 처리한다.
현재 진행하고있는 프로젝트에서 자주쓰이는 코드라 정의해본다.
// private 접근자를 가진 combinedText라는 Binding<String> 타입의 computed property를 정의
private var combinedText: Binding<String> {
// Binding 객체를 생성하여 반환. getter와 setter를 포함
Binding(
// getter: reWriteText와 STTtempText를 합쳐서 반환
get: { reWriteText + STTtempText },
// setter: 새로운 값이 들어올 때 실행되는 로직
set: { newValue in
// 새로운 값의 길이가 기존 텍스트 길이의 합과 다르다면 (키보드 입력이 있었다는 의미)
if newValue.count != reWriteText.count + STTtempText.count {
// 마이크가 활성화되어 있다면
if micisPressed {
// 마이크 비활성화
micisPressed = false
// 음성 인식 중지
speechRecognizer.stopTranscribing()
}
// 새로운 값을 reWriteText에 저장
reWriteText = newValue
// STTtempText 초기화
STTtempText = ""
return
}
// 새로운 값의 길이가 reWriteText 길이보다 크거나 같은 경우
if newValue.count >= reWriteText.count {
// 새로운 값에서 reWriteText 길이만큼 앞부분을 제외한 나머지 부분
let sttPart = String(newValue.dropFirst(reWriteText.count))
// sttPart가 현재 STTtempText와 다르다면
if sttPart != STTtempText {
// STTtempText를 새로운 sttPart로 업데이트
STTtempText = sttPart
} else {
// 같다면 전체 텍스트를 reWriteText에 저장
reWriteText = newValue
// STTtempText 초기화
STTtempText = ""
}
} else {
// 새로운 값의 길이가 reWriteText보다 작은 경우
// 새로운 값을 reWriteText에 저장
reWriteText = newValue
// STTtempText 초기화
STTtempText = ""
}
}
)
}