카테고리 없음

swift readline 대해 알아보자

kingarthur 2024. 6. 17. 18:05

일단 readline 사용하기 위해서는 연습하는 playground 에서 안된다.

입력 콘솔창이 이는 readline 사용해야된다.

playground는 샌드박스이기 때문에 input이 없다고 한다. 그래서 actual application을 통해서만 input을 받을 수 있다

실습준비해보자 

실습 가능한 actual application 파일 생성 방법은 다음과 같다.

들어가는 경로는 xcode > project > macOS > commandLineTool 

 

xcode Command Line Tool

 

Let's Code

 

우선 readLine() 함수를 input변수에 담아 print 해 보았다. 

실행 결과는

.

 

경고문이 뜬다. 

 

아까 공식문서의 리턴값이 String? 이었던 것에 대한 경고문이 뜬다.

그리고 출력값도 Optional 로 출력된 것을 볼 수 있다!

 

옵셔널을 unwrapping 해주어야 겠죠??

(Optional unwrapping에 대해서는 나중에 추가적으로 글을 작성 하고나서 링크를 달아둘 예정입니다.)

 

우선 !를 통해 강제해 주었습니다.

 

readLine() - 2

 

경고문이 사라졌죠? 출력 결과도 옵셔널이 벗겨진 상태로 잘 출력된 것을 볼 수 있습니다.

 

readLine()을 활용한 간단한 예제

readLine()을 통해 inch로 된 길이를 키보드로 입력값을 받고, cm로 변환된 값을 출력해겠습니다.

 

우선 input과 print문을 작성해주었습니다.

var input = readLine()!
print("제품의 크기(cm): \(input * 2.54)")

과연 출력이 잘 될까요?

그 결과는

.

.

.

.

 

 

 

Error.

당연한 결과 입니다ㅠㅠ,,

아까 위에서 보면 readLine() 의 리턴값은 String? 이고,

그걸 우리가 ! 를 사용해서 강제로 언래핑 해주었잖아요?

 

그러면 input의 타입은 String 인데,

String타입인 input과 Double타입인 2.54를 곱셈하려 하였으니..ㅎㅎ

 

자, 그럼 다시!

input값을 Double로 형변환을 해주는 코드를 추가해주어 봅시다.

var input = Double(readLine()!)
print("제품의 크기(cm): \(input * 2.54)")

다시 실행~

guess what 과연 잘 작동할까요?

.

.

.

.

 

 

 

두둥. 당연히 다시 Error가 납니다.

왜냐. 저희가 string값을 double타입으로 형변환을 해주는데,

input으로 받은 string값이 꼭 숫자만 들어있을 것이라는 법이 없잖아요? (문자일 수도 있으니)

 

우리는 inch를 입력값으로 받아 cm로 출력해줄 것이 때문에 input은 무조건 숫자일 것입니다.

그러므로 한번 더 ! 를 붙여 강제 언래핑을 해봅시다.

var input = Double(readLine()!)!
print("제품의 크기(cm): \(input * 2.54)")

그 결과는

.

.

.

.

 

 

readLine() - 3

 

짠!

3이라는 숫자를 입력하여 input에 받아주고 enter를 누르니

cm로 변환된 제품의 크기가 잘 출력되는 것을 볼 수 있습니다.ㅎㅎ

 

이렇게 한가지 인자를 키보드로부터 입력받아 출력하는 과정을 해보았습니다.

 

그런데,

여기서 질문.

지금은 값을 1개만 입력받았는데, 내가 여러개의 값을 인자로 받고 싶다면 어떻게 해야할까?

 

지금은 값을 1개만 입력받았는데, 내가 여러개의 값을 인자로 받고 싶다면 어떻게 해야할까?

이럴 때 components 를 쓰면 됩니다!

 

readline 입력값은 어디서 하나요???

 

혹시나 몰라서 남깁니다. 정답은 135 보이는 콘솔창에 입력하시면되세요~ 

안되면 플레이 돌리시면 입력이 가능합니다. 

 

readline 입력시 가더문으로 인트로 값을 받는 방법이다.

            guard let input = readLine(), let number = Int(input) else {
                print("올바른 값을 입력해주세요")
                continue
            }

요렇게 하는 방법은 없어서 남겨본다. 

 

다시 언급하지만 readline은 string 옵셔날 값으로 들어오기 때문에 사용할려면 무조건 변경을 해야된다. 

 

밑에 요거는 문자열이 인트값이 아니면 엘스 구문이 시작 

그리고 myInput  readline을 인트 배열로 만드는 방법이다. 머 다른 방법도 있다 필터로 해도되고. component 인가 이것도 사용해요

            guard let input1 = input?.allSatisfy({$0.isNumber}),
                  let myInput = input?.split(separator: "").map ({Int($0)}) else {
                print("숫자 3개를 입력해주세요")
                return
            }
            continue

 

배열을 인트로 만드는 새로운 방식!!!!!!!!!!!!!!

        let answerArray = Array(result)
        if answerArray[0] == 0  {
            return makeAnswer()
        } else {
            let answer = answerArray[0] * 100 + answerArray[1] * 10 + answerArray[2] * 1
            return answer
        }

신선한 방식이다. 요렇게 사용하는거... 처음 알아서 먼가 신기했다. 

 

딕셔너리도 실전에서 처음 사용해봐서 신기해서 남긴다...

class RecordManager {
    var dic : [Int: Int] = [:]
    func add(sets: Int ,count: Int) {
        dic[sets] = count
    }
    func showManager() {
        for i in dic {
            print("\(i.key)번째 :시도횟수 - \(i.value)")
        }
    }
}

분명히 나는 까먹을꺼니깐... 

많은 방식을 배워가는 것 같다. 

 

이거는 들어온 값을 반복적으로 실행하고 가드문으로 nil 방지  후 

들어온 값이 원하는 값인지 다시 스위치 문으로 방어하는 방식!!!

        while true {
            guard let input = readLine(), let number = Int(input) else {
                print("올바른 값을 입력해주세요")
                continue
            }

            switch number{
            case 100...999 :
                return number
            default:
                print("숫자 3개를 입력해주세요.")
            }
        }

이렇게도 처음해봐서 까먹지 않게 기록하기.

 

여거는 랜덤 숫자 만드는 방법 구현해봤다.

셋으로~ 

    func makeAnswer() -> Int {
        var result: Set<Int> = []
        while result.count < 3 {
            result.insert(Int.random(in: 0...9))
        }
        let answerArray = Array(result)
        if answerArray[0] == 0  {
            return makeAnswer()
        } else {
            let answer = answerArray[0] * 100 + answerArray[1] * 10 + answerArray[2] * 1
            return answer
        }
    }

요것도 언제든지 까먹을수 있기에 기록남기기 

 

하면서 그래도 조금씩 실력이 늘고 있어서 다행인것 같기는 하다

조금씩은 익숙해지고 있다. 

오늘은 잡탕처럼 글을 썻지만 

쭉 진행시캬ㅕ ~