Last active
September 17, 2018 03:10
-
-
Save hngfu/eabf637eb788bc4734e5d3892edd7514 to your computer and use it in GitHub Desktop.
This file contains 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
// | |
// main.swift | |
// UnitConverter | |
// | |
// Created by 조재흥 on 2018. 9. 11.. | |
// Copyright © 2018년 hngfu. All rights reserved. | |
// | |
import Foundation | |
func convertUnit(valueToConvert:String) -> String{ | |
let seperatedValueFromSpace = seperate(blankValue: valueToConvert) | |
let completelySeperatedValue = seperateInto(numberAndUnit: seperatedValueFromSpace[0]) | |
guard let numberPart = Double(completelySeperatedValue[0]) else {return "입력하신 값을 확인해주세요."} | |
let beforeConvert = completelySeperatedValue[1] | |
var AfterConvert = "" | |
if !supports(unit: beforeConvert) {return "지원하지 않는 단위입니다. 확인해주세요."} | |
if seperatedValueFromSpace.count == 1{ | |
AfterConvert = addDefaultUnit(unitBeforeConvert: beforeConvert) | |
} else { | |
AfterConvert = seperatedValueFromSpace[1] | |
} | |
if !supports(unit: AfterConvert) {return "지원하지 않는 단위입니다. 확인해주세요."} | |
return convertingUnit(numberPart, beforeConvert, AfterConvert) | |
} | |
//ex) 입력: "12cm m" -> 출력: ["12cm","m"], 입력: "12cm" -> 출력: ["12cm"] | |
func seperate(blankValue:String) -> [String]{ | |
return blankValue.split(separator: " ").map({String($0)}) | |
} | |
//ex) 입력: "12cm" -> 출력: ["12","cm"] | |
func seperateInto(numberAndUnit:String) -> [String]{ | |
var numberPart = "" | |
var unitPart = "" | |
for i in numberAndUnit { | |
switch i { | |
case "0","1","2","3","4","5","6","7","8","9",".": | |
numberPart.append(i) | |
default: | |
unitPart.append(i) | |
} | |
} | |
return [numberPart,unitPart] | |
} | |
//MARK: 단위를 추가할때 수정 부분 있음(1/2) | |
//ex) 입력: "cm" -> 출력: true, 입력: "hngfu" -> false | |
func supports(unit:String) -> Bool{ | |
let supportedUnits = ["cm","m","inch","yard","kg","g","oz","lb"] //여기에 단위 추가 | |
return supportedUnits.contains(unit) | |
} | |
//ex) 입력: "cm"(바뀌기 전 단위 입력하면) -> 출력: "m"(바꿀 단위 변수로 return 됩니다.) | |
func addDefaultUnit(unitBeforeConvert:String) -> String{ | |
switch unitBeforeConvert { | |
case "cm": | |
return "m" | |
case "m": | |
return "cm" | |
case "yard": | |
return "m" | |
default: | |
return unitBeforeConvert | |
} | |
} | |
//MARK: 단위를 추가할때 수정 부분 있음(2/2) '길이'는 'm'가 중심값, '무게'는 'kg'가 중심값 | |
//ex) 입력: (12,"cm","m") -> 출력: "0.12m", 입력: (12,"m","yard") -> 출력: "13.1233yard" | |
func convertingUnit(_ numberPart:Double, _ beforeConvert:String, _ AfterConvert:String) -> String{ | |
let unitInfo = ["cm" : 100, //여기에 단위와 단위값 추가 | |
"m" : 1.0, | |
"inch" : 39.370079, | |
"yard" : 1.093613, | |
"kg" : 1, | |
"g" : 1000, | |
"oz" : 35.273962, | |
"lb" : 2.204623] | |
guard let nonOptionalBeforeConvert = unitInfo[beforeConvert], | |
let nonOptionalAfterConvert = unitInfo[AfterConvert] else { | |
return "입력하신 값을 확인해 주세요." | |
} | |
let convertedUnitValue = (numberPart / nonOptionalBeforeConvert) * nonOptionalAfterConvert | |
return "\(convertedUnitValue)\(AfterConvert)" | |
} | |
print("Hngfu 단위변환기") | |
print("값과 변환전 단위 변환후 단위를 입력해주세요. \nex)10m inch ex2)123yard cm") | |
print("사용 가능 단위 : \"cm\",\"m\",\"inch\",\"yard\",\"kg\",\"g\",\"oz\",\"lb\"") | |
print("그만 이용 하시려면 'quit' 또는 'q'를 입력해주세요.") | |
print("=========================================") | |
while true { | |
if let willConvertUnitValue = readLine() { | |
if willConvertUnitValue == "quit" || willConvertUnitValue == "q" { | |
print("종료했습니다.") | |
break | |
} else { | |
print(convertUnit(valueToConvert: willConvertUnitValue)) | |
} | |
} else { | |
print("입력하신 값을 확인해주세요.") | |
} | |
} |
API를 사용하다보면 Optional 로 만들어지는 경우가 있습니다.
그런 경우 !
바로 붙여서 사용하기 보다는 기본값을 주거나 옵셔널을 풀어서 사용할 수 있도록 공부해보세요.
unitConverter() 함수는 여전히 동사형태가 아니네요. 이름을 개선해보세요.
unitConverter() 함수 내부가 크게 3부분으로 나눠져 있는 것 같습니다만, 전체를 길게 작성하기 보다는 함수를 3개로 분리해서 작성해보세요.
중첩된 if-else 대신 guard-else 구문을 공부해서 적용해보면 좋겠습니다.
다음 단계를 진행해보세요.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Data 라는 타입이 있어서 data라는 단어를 쓰는게 오해를 할 수 있습니다.
구체적인 의미를 주기 위해서 역할을 지정하는게 좋습니다.
Int 나 Float 같은 데이터 타입을 어떤 걸로 주로 할건지 정하는게 좋습니다. 참고로 스위프트는 기본 숫자 타입이 Double 입니다.
다음 단계 inch 까지 진행해보면서 함수 이름도 동사형태로 개선해보세요.