안녕하세요. 개발하는 정주입니다.
오늘은 Weather Today의 코드 리뷰에 대해 포스팅하려고 합니다.
목차
화면 1
화면 1에서 지적받은 부분은 한 곳이었습니다.
let country = self.countries[indexPath.row]
cell.textLabel?.text = country.name
let flagName = "flag_\(country.assetName)"
cell.imageView?.image = UIImage(named: flagName)
위 코드는 제가 원래 작성했던 코드입니다.
이 코드의 문제는 View Controller에서 데이터의 가공이 이루어졌다는 점입니다.
따라서 이 코드는 flagName을 Computed Property로 수정했습니다.
let assetName: String
var flagName: String {
return "flag_\(assetName)"
}
flagName을 assetName을 활용한 Computed Property로 바꾸니 가독성도 높아지고 기능 분리도 잘 되었습니다.
화면 2
화면 2에서는 자바의 getter를 스위프트에서는 어떻게 작성해야 하는지를 물어보았습니다.
항상 Clean 하고 스위프트스러운 코드로 짜겠다고 생각을 하면서 작성을 했기에 이런 부분은 어떨지 궁금했습니다.
private func getTemperatureTextColor(celsius: Double) -> UIColor {
if celsius < 10 {
return UIColor(named: "lowTemperature") ?? .blue
} else if celsius > 25 {
return UIColor.red
} else {
return UIColor(named: "normalTemperature") ?? .black
}
}
제가 처음 짠 코드입니다. 안드로이드를 개발할 때의 버릇으로 메서드 이름에 get을 썼네요.
스위프트는 함수형 프로그래밍 언어, 프로토콜 채택 지향 언어입니다.
따라서 Swifty 한 방법은 Temperature 구조체를 구현해서 celsius, fahrenheit, textColor를 Property로 넣는 것입니다.
struct Temperature: Codable {
let fahrenheit: Double
init(celsius: Double) {
self.fahrenheit = celsius * 1.8 + 32.0
}
init(fahrenheit: Double) {
self.fahrenheit = fahrenheit
}
var celsius: Double {
(fahrenheit - 32.0) / 1.8
}
var koreanDescription: String {
return String(format: "섭씨 %.1f도 / 화씨 %.1f도", celsius, fahrenheit)
}
var textColor: UIColor {
switch celsius {
case ..<10.0:
return UIColor(named: "lowTemperature") ?? .blue
case 25.0...:
return .red
default:
return UIColor(named: "normalTemperature") ?? .black
}
}
}
최대한 Swifty 하게 작성해본 코드입니다. 혹시 부족한 점이 있다면 댓글로 알려주세요.
생성자와 Computed Property를 활용해보았습니다.
Temperature 구조체 생성자는 화씨('F)로도 생성이 가능하게끔 하였습니다.
또한 한국에서는 일반적으로 섭씨('C)를 이용할 것이니 화씨 변수는 celsius로 생성될 때 자동으로 들어가게끔 처리하였습니다.
화면 3
화면 3에서 지적받은 것은 잘못된 Life Cycle에 대한 이해입니다.
override func viewWillAppear(_ animated: Bool) {
guard let city = self.city else {
return
}
self.navigationItem.title = city.name
self.stateImageView.image = UIImage(named: city.stateImageName)
self.stateLabel.text = city.stateString
self.temperatureLabel.text = city.temperatureText
self.rainfallProbabilityLabel.text = city.rainfallProbabilityText
}
viewWillAppear()에서 View를 갱신한다는 점입니다.
화면이 나타낼 때마다 데이터의 업데이트가 필요하다면 잘한 선택이었지만
이번 프로젝트에서는 불필요하게 View를 변경하여 비효율적입니다.
리뷰어님께서 지적해주시지 않았다면 다음에도 동일한 실수를 했겠지요. 정말 감사했습니다.
따라서 해당 코드는 viewWillAppear()에서 viewDidLoad()로 이동시켰고
동일한 기능을 수행하며 더 효율적이게 코드를 작성하였습니다.
마무리 잡담
이번 포스팅까지 해서 부스트 코스의 세 번째 프로젝트가 끝났습니다.
Swifty 한 코드를 짜기 위해서는 더욱더 열심히 해야겠다는 생각이 들었습니다.
감사합니다!
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.