목차
SwiftUI tutorial을 따라하며 공부 중 이해가 어려웠던 개념이 있다.
데이터에 대한 간단한 설명을 하자면 아래의 json파일은 하나의 landmark 이고,
각지의 Landmark들을 모아서 파싱한 배열이 landmarks 이다.
그리고 이해가 안됐던 문제의 코드를 보여드립니다.
//toggle에 바인딩 되는 bool 값
@State private var showFavoritesOnly = false
//List에 뿌려지는 배열(조건에 따라 다른 항목을 반환하는 연산프로퍼티)
var filteredLandmarks: [Landmark] {
landmarks.filter { landmark in
(!showFavoritesOnly || landmark.isFavorite)
}
}
List {
Toggle(isOn: $showFavoritesOnly) {
Text("Favorites only")
}
ForEach(filteredLandmarks) { landmark in
...
}
filterdLandmarks라는 연산 프로퍼티의 필터되는 조건이 이해가 안됐다.
간단하게 내용들을 설명하고, 본론으로 들어가겠습니다!
json파일에 있는 랜드마크들의 리스트를 화면에 보여줄건데 좋아요 표시한 랜드마크들만 따로 모아서 보여줄 수있게 토글을 설치하고
그래서 토글이 false면 모든 리스트, true면 좋아요한 랜드마크다.
이걸 어떻게 하냐면
ForEach(filteredLandmarks) { landmark in
landmarks를 필터링한 filteredLandmarks 배열을 리스트로 뿌려준다.
근데 그 배열은 연산프로퍼티로 필터링이 되는데, 조건을 !showFavoriteOnly or landmark.isFavorite으로 갖는다.
@State private var showFavoritesOnly = false
var filteredLandmarks: [Landmark] {
landmarks.filter { landmark in
(!showFavoritesOnly || landmark.isFavorite)
}
}
무슨 뜻이냐면 토글값이 보통일 땐 모든 항목을 보여주고, 토글값이 켜지면(true) 좋아요 항목만 보여준다. (밑에서 자세히 설명)
설명하기 전에 filter함수의 원리를 간략하게 짚고 넘어가자.
밑의 코드는 같은 내용을 for - in 반복문과 filter함수를 사용하여 비교한 것이다.
filter함수는 for-in 반복문처럼 배열항목 하나하나에 접근을 한다.
위의 내용을 보면, array의 항목하나하나에 접근을 한다.
예를 들어 1에 접근 했을 때, 클로저 안의 조건문이 true라면, 접근한 숫자 1을 배열에 담아주고
모든 항목을 돌면서 반복해준다.
자 그럼 이제 본론입니다
@State private var showFavoritesOnly = false
var filteredLandmarks: [Landmark] {
landmarks.filter { landmark in
(!showFavoritesOnly || landmark.isFavorite)
}
}
filterdLandmarks라는 연산 프로퍼티의 필터되는 조건이 이해가 안됐다.
landmark.isFavorite은 landmark가 가지고 있는 프로퍼티 중에 하난데 즐겨찾기 조건으로 활용된다. (맨위에 json참조)
일단, 예를 들어서
0번째 landmark에 접근해서 landmark.isFavorite 의 bool 값을 확인하고 반환하는건 이해가 된다. landmark가 가지고 있는 프로퍼티이기 때문이다.
근데 showFavoriteOnly 값은 landmark와 전혀 상관이 없는데 어떻게 얘에 따라서 landmark를 리스트에 보여주는 조건을 좌지우지하냐가 이해하기 어려웠다.
그게 가능했던 이유는 landmark와 관계 없이 Bool값으로 filter 했기 때문이다.
예를 들어 0번째 landmark 값에 접근했을 때 landmark 자체의 프로퍼티와 상관 없이 어쨋든 0번째 landmark를 보고 있는데 true 값이다? 그럼 그 landmark가 통과되는 것이다.
또 그 조건들을 or 로 묶어놨기 때문에 둘 중 하나만 true가 되면 항목을 통과시키는데,
showFavoriteOnly가 false면 !을 붙여 true가 되니까 isFavorite값과 관계 없이 모든 항목을 보여준다.
showFavoriteOnly가 true면 !을 붙여 false가 되니까 isFavorite값이 true인 landmark 들만 통과시킨다.
'SwiftUI' 카테고리의 다른 글
SwiftUI) Preview 크래시 발생 사례 (EnvironmentObject) (0) | 2024.01.17 |
---|---|
SwiftUI)토스 주식 탭 애니메이션 구현하기 (3) | 2023.06.06 |
SwiftUI) 토스 애니메이션 구현해보기 (0) | 2023.05.23 |
SwiftUI)Preview Crashed는 왜 일어날까 (0) | 2023.04.10 |