본문 바로가기

DEV

[iOS/Swift] readLine() 한 줄로 입력받은 값 배열로 변환하기 (troubleshooting)

반응형

 

야구게임 프로젝트에서 위처럼 readLine()으로 한줄로 입력받도록 구현해야 했었는데, 이미 for문으로 값을 3번입력 받도록 readLine()을 3번써서 구현해놓은 상태였다.

 

그래서 이를 한 줄 입력으로 변경하고자 하였다.

그러기 위해서는  var userAnswer = [String]() 처럼 String 배열로 구현해놓은 것을 String으로 바꿔야 했는데, 여기서 문제가 생겼다.

for i in 0..<3 {
    if userAnswer[i] == answer[i] {
        strikes += 1
    } else if userAnswer.contains(answer[i]) {
        balls += 1
    }
}

 

위 코드에서 처럼 유저가 입력받은 답과, 기존 답과의 비교를 위해 인덱싱을 해야했다.

하지만 Swift에서는 String에서 파이썬에서 처럼 str[0]과 같이 바로 인덱싱이 불가능했다.

파이썬 문법과 혼동되었다.

 

그래서 인터넷으로 정보를 찾아봤다.

 

https://velog.io/@bibi6666667/Swift-String.Index-%EA%B7%B8%EB%A6%AC%EA%B3%A0-Substring-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%8B%A4%EB%A3%A8%EA%B8%B0

 

[Swift] String.Index (그리고 Substring) - 문자열 다루기

애플 공식 문서Swift Standard Library > String > String.Indexhttps://developer.apple.com/documentation/swift/string/index/Swift Standard Library > Subst

velog.io

 

위 블로그에서 해당 정보들을 찾아봤지만, 즉각적으로 인덱싱하기는 힘들어보였다.

 

그래서 결국에는 문자열로 입력받은 값을 초기에 배열로 바꿔서 구현하도록 했다.

https://velog.io/@loganberry/Swift-%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84-%EB%AC%B8%EC%9E%90-%EB%B0%B0%EC%97%B4%EB%A1%9C-%EB%B0%94%EA%BE%B8%EB%8A%94-%EB%B0%A9%EB%B2%95

 

[Swift] 문자열을 문자 배열로 바꾸는 방법

문자열을 문자배열로 변환하기

velog.io

그래서 위와 같은 블로그를 찾아서 구현을 하려 했지만, 오류가 났다.

알고보니 여기 블로그에서는 문자열을 '문자'배열로 바꾸는 거였다.

하지만 나는 '문자열'배열로 선언을 해놨어서 오류가 났던 것이였다.

나는 문자, 문자열 배열이 따로 구분되어있다고 생각을 못했어서 이런 잘못을 해버렸다.

 

이것도 기존 파이썬 문법과 혼동되어서 생긴 문제였다.

파이썬에서는 문자와 문자열을 따로 구분하지 않기 때문이다.

하지만 Swift에서는 문자 문자열을 따로 구분한다. (Character, String)

 

결국 다시 검색을 하였다.

https://clamp-coding.tistory.com/214

 

[Swift] 문자, 문자열 처리 함수

기본 / 배열 변환 string.count // 문자열의 개수 Int string.isEmpty // 문자열이 비었는지 true/false string.contains("문자열") // 문자열이 문자열을 포함하는지 true/false string.randomElement() // 문자열중 랜덤을 리

clamp-coding.tistory.com

해당 블로그에서 관련 정보를 얻었다.

 

string.count 		// 문자열의 개수 Int
string.isEmpty 		// 문자열이 비었는지 true/false
string.contains("문자열") // 문자열이 문자열을 포함하는지 true/false
string.randomElement() // 문자열중 랜덤을 리턴
string.suffled() 	// 문자열을 섞어서 Character배열로 리턴

let sArr = string.map{ String($0) } //문자열을 String배열로 리턴
let string = sArr.joined()  //String배열을 String으로 변환

let arr = Array(string) // 문자열을 Character배열로 변환
let string = String(arr) // Character배열을 문자열로 변환

 

이 정보들이 유용하였다.

 

위 처럼 map을 통해 문자열을 String 배열로 변환하기로 하였다.

var userAnswer = [String]()

// 한 줄 입력으로 변경
userAnswer = (readLine() ?? "").map { String($0) }

 

결국 위와 같이 해결을 하게되었다.

참고로 readLine()은 String?을 변환하기에 위처럼 nil 값을 ""로 설정해줘야했다.

 

.joined 함수도 이용하여, 디버깅 시 정답이 배열(["1", "2", "3"])이 아닌 문자열("123")로 나오도록 바꿨다.

 

String과 Character가 구분된다는 것을 헷갈려해서 이미 Character 형태로 데이터를 받아오는게 맞는데, String으로 전부 받아버렸다.

딱히 프로그램 동작에 지장은 없을 것 같지만, 나중에 생긴다면 이것도 바꿔봐야겠다.

반응형