-
-
Save AppleCEO/811be07b7a4329ad6709491706bf432b to your computer and use it in GitHub Desktop.
| // | |
| // main.swift | |
| // UnitConverter | |
| // | |
| // Created by Doran & Dominic on 02/04/2019. | |
| // Copyright © 2019 hw. All rights reserved. | |
| // | |
| import Foundation | |
| import Darwin | |
| let mToCm:Double = 100 | |
| let inchToCm:Double = 2.54 | |
| let yardToCm:Double = 91.44 | |
| func convert (_ num: Double, _ from: String, _ to: String) -> (Double, String) { | |
| var result = (num, to) | |
| switch from { | |
| case "cm" : | |
| result = convertFromCm((num, to)) | |
| case "m" : | |
| result = convertFromM((num, to)) | |
| case "inch" : | |
| result = convertFromInch((num, to)) | |
| case "yard": | |
| result = convertFromYard((num, to)) | |
| default : | |
| unavailableFeet() | |
| } | |
| return result | |
| } | |
| func unavailableFeet() { | |
| print("지원하지 않는 단위입니다") | |
| unitConverter() | |
| exit(0) | |
| } | |
| func convertFromCm (_ input: (number: Double, to: String) ) -> (Double, String) { | |
| var result = (input.number, input.to) | |
| switch input.to { | |
| case "yard": | |
| result.0 = input.number/yardToCm | |
| case "inch": | |
| result.0 = input.number/inchToCm | |
| case "", "m": | |
| result.0 = input.number/mToCm | |
| result.1 = "m" | |
| default: | |
| unavailableFeet() | |
| } | |
| return result | |
| } | |
| func convertFromM (_ input: (number: Double, to: String) ) -> (Double, String) { | |
| var result = (input.number, input.to) | |
| switch input.to { | |
| case "yard": | |
| result = convertFromM((input.number, "cm")) | |
| result = convertFromCm((result.0, input.to)) | |
| case "inch": | |
| result = convertFromM((input.number, "cm")) | |
| result = convertFromCm((result.0, input.to)) | |
| case "", "cm": | |
| result = (input.number*mToCm, "cm") | |
| default: | |
| unavailableFeet() | |
| } | |
| return result | |
| } | |
| func convertFromInch (_ input: (number: Double, to: String) ) -> (Double, String) { | |
| var result = (input.number, input.to) | |
| switch input.to { | |
| case "m": | |
| result = convertFromInch((input.number, "cm")) | |
| result = convertFromCm((result.0, input.to)) | |
| case "","cm": | |
| result = (input.number*inchToCm, "cm") | |
| default: | |
| unavailableFeet() | |
| } | |
| return result | |
| } | |
| func convertFromYard (_ input: (number: Double, to: String) ) -> (Double, String) { | |
| var result = (input.number, input.to) | |
| switch input.to { | |
| case "","m": | |
| result = (input.number*yardToCm, "m") | |
| result = convertFromCm(result) | |
| default: | |
| unavailableFeet() | |
| } | |
| return result | |
| } | |
| // 입력받아 숫자와 단위를 구분하는 함수 | |
| func inputsMaker(_ `in` : String)->(Double, String){ | |
| let unit = `in`.trimmingCharacters(in: CharacterSet(charactersIn: "0123456789.")) | |
| let numDouble:Double = Double(`in`.trimmingCharacters(in: CharacterSet(charactersIn: unit))) ?? 0.0 | |
| if(numDouble == 0.0){ | |
| print("숫자를 정확히 입력해주세요.") | |
| unitConverter() | |
| } | |
| return (numDouble, unit) | |
| } | |
| // 단위를 자르는 함수 | |
| func unitsMaker(_ unit : String)->(String, String){ | |
| var units = unit.split(separator: " ") | |
| if(units.count<2) { | |
| let unitDiff = 2-units.count | |
| for _ in 0..<unitDiff { | |
| units.append("") | |
| } | |
| } | |
| return (String(units[0]), String(units[1])) | |
| } | |
| func unitConverter() -> Void { | |
| let inputFromUser = readLine() | |
| if inputFromUser == "quit" || inputFromUser == "q" { | |
| exit(0) | |
| } | |
| if let input = inputFromUser { | |
| let (num, unit) = inputsMaker(input) | |
| let (from, to) = unitsMaker(unit) | |
| let result = convert(num, from, to) | |
| print("\(result.0)\(result.1)") | |
| unitConverter() | |
| } | |
| } | |
| // RUN | |
| unitConverter() | |
변환 함수가 계산 결과를 문자열로 리턴하고 있는데
return "\(result)yard" 단위를 붙여서 리턴하는 것보다는 값과 단위를 분리해보면 어떨까요?
그러면 일부 함수는 다른 함수의 변환 결과를 그대로 활용할 수 있을것 같습니다.
unitConverter() 내부에서 str! 형태로 옵셔널 값을 처리하는 동작이 반복적으로 나옵니다.
이 부분도 앞부분에서 옵셔널 unwrapping 해서 이후에는 모두가 !를 붙이지 않고 사용하도록 개선해보세요.
모든 변환 함수가
let doubleValue : Double = NSString(string: str as NSString).doubleValue이렇게 형변환을 하고 있는데
그러면 외부에서 호출하기 전에 형변환을 해서 Double 타입으로 전달하는 건 어떨까요?
수정 완료
변환 함수가 계산 결과를 문자열로 리턴하고 있는데
return "\(result)yard"단위를 붙여서 리턴하는 것보다는 값과 단위를 분리해보면 어떨까요?
그러면 일부 함수는 다른 함수의 변환 결과를 그대로 활용할 수 있을것 같습니다.
수정 완료!
unitConverter() 내부에서
str!형태로 옵셔널 값을 처리하는 동작이 반복적으로 나옵니다.
이 부분도 앞부분에서 옵셔널 unwrapping 해서 이후에는 모두가!를 붙이지 않고 사용하도록 개선해보세요.
수정 완료했습니다
unitConverter() 내부에서
str!형태로 옵셔널 값을 처리하는 동작이 반복적으로 나옵니다.
이 부분도 앞부분에서 옵셔널 unwrapping 해서 이후에는 모두가!를 붙이지 않고 사용하도록 개선해보세요.수정 완료했습니다
여전히 str! 가 계속 반복적으로 나오는데요?
@godrm 수정하고 소스를 페이지에 반영 안했던 것 같습니다. 현재 안나오도록 변경한 상태입니다
모든 변환 함수가
let doubleValue : Double = NSString(string: str as NSString).doubleValue이렇게 형변환을 하고 있는데그러면 외부에서 호출하기 전에 형변환을 해서 Double 타입으로 전달하는 건 어떨까요?