Instance Method pickerView(_:didSelectRow:inComponent:)
: 픽커뷰의 행이 선택될 때마다 호출된다.
어떤 이벤트(event)가 발생할 때마다 호출되는 메서드를 이벤트 핸들러(event handler)라고 부른다.
예를들어 10km를 선택했다면 그값이 마일로 변환되어 레이블에 표시되도록 하려고 한다.
우선 변환된 값을 표시할 레이블과 해당 아웃렛을 생성한다.
또한 킬로미터와 마일이 변환되는 공식을 알아야 할 것이다. (0.621371을 곱하면 된다.)
그 공식을 이용해 행이 선택될 때마다 호출되는 메서드에 값이 변환되도록 구현해 보자.
또한 변환되는 메서드를 별도의 모델로 분리해보자.
IBOutlet weak var distanceLabel: UILabel! // distanceLable이라는 아웃렛 변수를 선언하였다.
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int,
inComponent component: Int) {
let kmeter = Float(distanceValues[row]) // 선택된 행의 값을 Float형으로 변환하여,
let mile = 0.621371 * kmeter // 마일로 변환하는 공식을 적용하고,
distanceLabel.text = "\(mile)mile" // 레이블에 출력한다.
}
이제 MVC 패턴에 따라 변환되는 부분을 별도의 모델로 분리할 것이다.
결국 새로운 클래스를 생성하여 분리하면 되는것이다.
class Converter {
func toMile(kilo meter: Int) -> Float {
return 0.621371 * Float(meter)
}
}
Converter.swift라는 새로운 파일에 Conver 클래스를 생성하여 toMile이라는 메서드를 구현하였다.
fileprivate let converter = Converter() // 메서드를 이용하기 위해 먼저 인스턴스를 생성한다.
그러므로 픽커뷰의 메서드도 변경되어야 한다.
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int,
inComponent component: Int) {
let kmeter = Float(distanceValues[row])
distanceLabel.text = "\(converter.toMile(kilo:kmeter))mile" // 이렇게 바뀌어야 한다.
}
행이 선택될 때마다 레이블에 마일로 변환되어 표시되는 것을 확인하자.
이제 어느정도 픽커뷰가 동작하는 원리가 이해 될 것이다.
또한 MVC 패턴에 따라 모델을 분리하는 연습을 해보았는데 항상 정보와 그 정보를 가공하는 메서드는 별도의 모델로 분리한다는것을 기억하라.
마찬가지로 마일을 킬로미터로 변환되도록 구현해보자.