-
-
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 타입으로 전달하는 건 어떨까요?