킬로미터를 마일로, 마일을 킬로미터로 변환하는 앱을 만들어 볼 것이다.
2개의 컴포넌트를 준비하여 각각의 픽커뷰에 킬로미터와 마일을 1부터 100까지 표시해 보자.
킬로미터만 표시해보면 마일도 자연스럽게 표시할 수 있을 것 이다.
먼저 원리를 이해하기 위해 1~5m까지 만들어보고 for in 루프를 이용하여 1~100km 까지 범위를 늘려보자.
1~5km, 즉 1,2,3,4,5 를 픽커뷰에 표시하려면 무슨 자료형에 담는것이 적당할까? 그렇다. 바로 배열이다.
1~5의 정수를 담을 배열을 선언하여 뷰가 로드되었을때 생생되도록 코딩하되, 이 변수는 선언된 파일내에서만 접근이 가능하도록 지정해보자.
// distanceValues라는 변수에 정수형 배열의 인스턴스를 생성하였다. fileprivate 키워드를 추가하면 해당변수는 선언된 파일 내에서만 접근이 가능하다.
fileprivate var distanceValues = [Int]()
// 뷰가 메모리에 로드되면 distanceValues에 1~5의 정수가 배열로 할당된다.
override func viewDidLoad() {
super.viewDidLoad()
distanceValues = [1, 2, 3, 4, 5]
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
// row값에 따라 각각의 값이 kmerterValue에 할당되어 "값"km 형식으로 반환된다.
let kmeterValue = distanceValues[row]
return "\(kmeterValue)km"
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return distanceValues.count // distanceValues의 갯수만큼 row의 값을 지정한다.
}
실행해보면 1~5km의 값이 픽커뷰에 표시되는것을 볼 수 있다. 이제 1~100km를 표시할 것인데 지금처럼 1~100의 값을 타이핑 하고 싶진 않을것이다. 그것은 프로그래밍이 아니다.
for in 루프를 이용하여 1~100까지의 배열을 자동생성하여 픽커뷰에 표시해보자.
override func viewDidLoad() {
super.viewDidLoad()
for i in 1...100 {
distanceValues.append(i)
}
앱을 실행해보면 1~100km가 픽커뷰에 표시되는데 범위를 변경하고 싶다면 간단하게 숫자만 변경해주면 된다. 멋지지 않은가? 같은 방식으로 다른 컴포넌트에 마일로 표시해보자.