개발자는 반복 작업을 싫어하는 법.. (컴퓨터가 할 일이지)
ForEach 루프를 활용해 효율적으로 여러 뷰를 만드는 방법에 대해 알아보자.
위의 예시와 같이 여러 원과 텍스트를 쉽게 찍어낼 수 있다.
ForEach는 구조체이다. 말 그대로 Each, 각각.. 순서대로 돌아가며 작업을 하는 것이다.
이름이 대문자로 시작하는 것을 보면 눈치 챘을 사람이 있었을수도 있지만.. 얼핏 생각하면 메서드로 착각할 수도 있겠다.
https://developer.apple.com/documentation/swiftui/foreach
제네릭과 where절을 통한 조건(프로토콜)도 있다.
생성자도 매우 다양하다.
// Created by Toughie on 2023/04/12.
//
import SwiftUI
struct ForEachLoop: View {
let data: [String] = ["Hi", "I'm", "Choonsik"]
var body: some View {
VStack {
//id는 Hashable해야한다. Swift의 기본타입(Int,String..)은 대부분 Hashable
ForEach(data.indices, id: \.self) { index in
Text("\(data[index]): \(index)")
}
}
}
struct forEachLoop_Previews: PreviewProvider {
static var previews: some View {
ForEachLoop()
}
}
}
.indices
그럼 .indices는 뭘까? 콜렉션의 인스턴스 프로퍼티다.
배열을 안전하게 조회하는 방법.. 이라고들 말하는데 이게 무슨 말인지 잘 안와닿을 수 있다.
https://developer.apple.com/documentation/swiftui/binding/indices-swift.property
let myArray = [1, 2, 3, 4, 5]
let validIndices = myArray.indices
// returns a collection of [0, 1, 2, 3, 4]
// 이렇게 원 배열 아이템 각 요소의 인덱스들로 이루어진 새로운 배열을 리턴한다.
ForEach range 부분에서 0..<Array.count 이런 방식으로 해도 되지만
.indices를 쓰는 것이 더 깔끔하고 확실, 안전하다.
Hashable
https://developer.apple.com/documentation/swift/hashable
Swift에서 Hashable 프로토콜은 타입의 Hash Value을 제공하는 데 사용된다.
Hash Value은 다른 객체 또는 값과 '효율적으로 비교'할 수 있는 방식으로 객체 또는 값을 나타내는 데 사용되는 정수이다.
타입이 Hashable 프로토콜을 준수하는 경우 객체 또는 값의 내용을 기준으로
Hash Value를 계산하고 저장하는 hash(into:) 메서드를 구현해야 한다.
Hash Value는 Set 및 Dictionary과 같은 컬렉션에서 객체 또는 값을 '효율적으로 검색하고 비교'하는 데 사용된다.
예를 들어, Int 값 집합이 있는 경우 해시 가능 프로토콜을 사용하여 정수의 해시 값을 계산한 다음
지정된 값이 집합에 있는지 여부를 효율적으로 확인한다.
-> 해쉬 함수를 통해 해쉬값이 나옴. (Hashable 프로토콜은 Equatable 프로토콜을 채택한다.)
빠른 검색, 비교를 위해서 객체나 값이 고유한 해시값을 가진다.
(문자 배열을 예시로 들면.. 각 문자 리터럴을 가지고 검색, 비교보다 우선 해시값을 가지고 검색, 비교 하는 것이 훨씬 빠르기 때문)
하지만 해시값이 유일성을 보장하지는 않는다. 동일한 속성값을 가지면 동일한 해시값을 가질 수도 있음. (해시 충돌)
'SwiftUI > SwiftUI(Basic)' 카테고리의 다른 글
[SwiftUI] PropertyWrapper, @State, @Binding (0) | 2023.04.13 |
---|---|
13. [SwiftUI] ScrollView / LazyVStack & LazyHStack (0) | 2023.04.13 |
11. [SwiftUI] init() (0) | 2023.04.12 |
10. [SwiftUI] Spacer() (0) | 2023.04.05 |
9. [SwiftUI] .padding() 패딩 (0) | 2023.04.04 |