Starbucks Caramel Frappuccino
본문 바로가기
  • 그래 그렇게 조금씩
SwiftUI/SwiftUI(Basic)

12. [SwiftUI] ForEach / .indices / Hashable

by Toughie 2023. 4. 13.

개발자는 반복 작업을 싫어하는 법.. (컴퓨터가 할 일이지)

ForEach 루프를 활용해 효율적으로 여러 뷰를 만드는 방법에 대해 알아보자.

위의 예시와 같이 여러 원과 텍스트를 쉽게 찍어낼 수 있다.

 

ForEach는 구조체이다. 말 그대로 Each, 각각.. 순서대로 돌아가며 작업을 하는 것이다.

 

이름이 대문자로 시작하는 것을 보면 눈치 챘을 사람이 있었을수도 있지만.. 얼핏 생각하면 메서드로 착각할 수도 있겠다.

https://developer.apple.com/documentation/swiftui/foreach

 

ForEach | Apple Developer Documentation

A structure that computes views on demand from an underlying collection of identified data.

developer.apple.com

제네릭과 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

 

indices | Apple Developer Documentation

The indices that are valid for subscripting the collection, in ascending order.

developer.apple.com

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

 

Hashable | Apple Developer Documentation

A type that can be hashed into a to produce an integer hash value.

developer.apple.com

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