Skip to content

Instantly share code, notes, and snippets.

@hngfu
Last active September 17, 2018 03:10
Show Gist options
  • Save hngfu/eabf637eb788bc4734e5d3892edd7514 to your computer and use it in GitHub Desktop.
Save hngfu/eabf637eb788bc4734e5d3892edd7514 to your computer and use it in GitHub Desktop.
//
// 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("입력하신 값을 확인해주세요.")
}
}
@godrm
Copy link

godrm commented Sep 13, 2018

Data 라는 타입이 있어서 data라는 단어를 쓰는게 오해를 할 수 있습니다.
구체적인 의미를 주기 위해서 역할을 지정하는게 좋습니다.
Int 나 Float 같은 데이터 타입을 어떤 걸로 주로 할건지 정하는게 좋습니다. 참고로 스위프트는 기본 숫자 타입이 Double 입니다.
다음 단계 inch 까지 진행해보면서 함수 이름도 동사형태로 개선해보세요.

@godrm
Copy link

godrm commented Sep 14, 2018

API를 사용하다보면 Optional 로 만들어지는 경우가 있습니다.
그런 경우 ! 바로 붙여서 사용하기 보다는 기본값을 주거나 옵셔널을 풀어서 사용할 수 있도록 공부해보세요.
unitConverter() 함수는 여전히 동사형태가 아니네요. 이름을 개선해보세요.
unitConverter() 함수 내부가 크게 3부분으로 나눠져 있는 것 같습니다만, 전체를 길게 작성하기 보다는 함수를 3개로 분리해서 작성해보세요.

@godrm
Copy link

godrm commented Sep 14, 2018

중첩된 if-else 대신 guard-else 구문을 공부해서 적용해보면 좋겠습니다.
다음 단계를 진행해보세요.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment