Last active
April 2, 2019 09:38
-
-
Save sunghyun-k/c85540f4010a280470752f0c831c0209 to your computer and use it in GitHub Desktop.
2-5 까지 진행
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import Foundation | |
| // 숫자와 문자 나누기 | |
| func divide(_ input: String) -> (number: Double, from: String, to: String)? { | |
| var from = String() | |
| var to = String() | |
| let inputUnit = input.trimmingCharacters(in: CharacterSet(charactersIn: "0123456789.")) | |
| var index = inputUnit.endIndex | |
| if let innerIndex = inputUnit.firstIndex(of: " ") { | |
| index = innerIndex | |
| to = String(inputUnit[innerIndex...]) | |
| to = to.replacingOccurrences(of: " ", with: "") | |
| } else { | |
| to = "" | |
| } | |
| from = String(inputUnit[..<index]) | |
| guard let number = Double(input.trimmingCharacters(in: CharacterSet(charactersIn: "0123456789").inverted)) else { | |
| return nil | |
| } | |
| return (number, from, to) | |
| } | |
| // to inch 변환 함수들 | |
| func meterToInch(_ input: Double) -> Double { | |
| return input * 39.37 | |
| } | |
| func centimeterToInch(_ input: Double) -> Double { | |
| return input / 2.54 | |
| } | |
| func yardToInch(_ input: Double) -> Double { | |
| return input * 36 | |
| } | |
| // from inch 변환 함수들 | |
| func inchToMeter(_ input: Double) -> Double { | |
| return input / 39.37 | |
| } | |
| func inchToCentimeter(_ input: Double) -> Double { | |
| return input * 2.54 | |
| } | |
| func inchToYard(_ input: Double) -> Double { | |
| return input / 36 | |
| } | |
| // 변환하기 | |
| func convertUnit(_ input: String) -> String { | |
| guard let dividedNumber = divide(input) else { | |
| return "올바른 형식이 아닙니다." | |
| } | |
| var result = Double() | |
| switch dividedNumber.from { | |
| case "m": | |
| result = meterToInch(dividedNumber.number) | |
| case "cm": | |
| result = centimeterToInch(dividedNumber.number) | |
| case "yard": | |
| result = yardToInch(dividedNumber.number) | |
| case "inch": | |
| result = dividedNumber.number | |
| default: | |
| return "지원하지 않는 범위입니다." | |
| } | |
| switch dividedNumber.to { | |
| case "m": | |
| result = inchToMeter(result) | |
| return String(result) + "m" | |
| case "cm": | |
| result = inchToCentimeter(result) | |
| return String(result) + "cm" | |
| case "yard": | |
| result = inchToYard(result) | |
| return String(result) + "yard" | |
| case "inch", "": | |
| return String(result) + "inch" | |
| default: | |
| return "지원하지 않는 범위입니다." | |
| } | |
| } | |
| // 유저 컨트롤 | |
| func userController() { | |
| while true { | |
| let input = readLine()! | |
| if input == "q" { | |
| break | |
| } | |
| print(convertUnit(input)) | |
| } | |
| } | |
| userController() |
39.37, 2.54 같은 상수는 하드코딩해서 직접 값을 쓰지말고,
상수를 활용해서 코드로 표현하고 사용하는 곳에서 모두 같은 상수를 쓰도록 개선해보세요.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
switch 구문이 dividedNumber.from 와 dividedNumber.to 로 나눠져 있는데
비교구문을 없애고 한꺼번에 처리할 수 있는 방법은 없을까요?
다음 단계를 하면서 같이 한 번 고민해보세요 :)