์ด์ ์ ํญ์ ProgressVew๋ก ๋ก๋ฉ์ค์ธ ํ๋ฉด์ ๊ตฌํํ์๋๋ฐ, ํ ํญ์ ๊ตฌํํ๋ฉด์ .redacted๋ฅผ ์ฌ์ฉํด๋ณด๊ณ ์ถ์๋ค.
์ฑ์ ์ ์ฉํ ์ง๋ ํ์คํ์ง ์์ง๋ง,, ๊ฐ๋จํ๊ฒ ๊ธฐ๋กํ๊ณ ์ ์์ฑํ๋ค.
redacted๋?
๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด, redacted๋ ์ปจํ ์ธ ๋ฅผ ๊ฐ๋ ค์ฃผ๋ ๋ฉ์๋์ ๋๋ค.
๊ณต์ ๋ฌธ์๋ฅผ ๋ณด๊ธฐ ์ ์ ์ค๋ช ์ด ์๋ฟ๋์?
(์๋์!!!!?)

๋จ์ด๋ถํฐ ์ดํดํ๊ณ ๊ฐ์๋ฉด, ์ด ๊ธ์์ ์ค๋ช ๋์ด์๋ ๊ฒ ์ฒ๋ผ ๊ธฐ๋ฐ ๋๋ ๋ฏผ๊ฐํ ๋ด์ฉ์ ์ง์ฐ๋ค๋ผ๋ ๋ป์ ๊ฐ๊ณ ์์ต๋๋ค.
๊ทธ๋์ reason์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ฆฌ๊ธฐ ์ํ ์ด์ ๋ฅผ ๊ฐ์ด ์์ฑํด์ฃผ๋ ๊ฑฐ๊ฒ ์ฃ ?

redacted ์ฌ์ฉํด๋ณด๊ธฐ
์ผ๋จ RedactionReasons์๋ ํ์ฌ 3๊ฐ์ง๊ฐ ์กด์ฌํฉ๋๋ค.

๊ฐ๊ฐ ์ฌ์ฉ์ ๋ํด์๋ ์ฌ๊ธฐ์ ๋ ์๋ ค๋๋ฆฌ๊ฒ ์ต๋๋ค!!
3๊ฐ์ง ์ค์์ placeholder๋ฅผ ์ฌ์ฉํด์ ์ค์ผ๋ ํค ๋ทฐ๋ฅผ ๋ง๋ค์ด๋ด ์๋ค!!!
struct ContentView: View {
var body: some View {
VStack(alignment: .leading, spacing: 30) {
VStack(alignment: .leading) {
Text("Email")
.font(.title3)
Text("jini@naver.com")
.font(.body)
}
VStack(alignment: .leading) {
Text("Password")
.font(.title3)
HStack(spacing: 60) {
Text("abcd1234")
.font(.body)
Image(systemName: "eye.circle")
}
.redacted(reason: .placeholder) // <-- ์ฌ๊ธฐ
}
}
}
}
์ด๋ ๊ฒ .redacted(reason: .placeholder)๋ฅผ ์์ฑํด์ฃผ๋ฉด ์๋์ ์ค๋ฅธ์ชฝ ์ด๋ฏธ์ง์ฒ๋ผ ํจ์ค์๋๊ฐ ๊ฐ๋ ค์ง๋๋ค.

unredacted๋?

๋ฌธ์๋ฅผ ์ดํด๋ณด๋ฉด unredacted()๋ผ๋ ๋ฉ์๋๋ ๋ฐ๊ฒฌํ ์ ์์ต๋๋ค. ์ด ๋ฉ์๋๋ ๋ทฐ ๊ณ์ธต์ ์ ์ฉ๋ redacted ์ํ๋ฅผ ์ ๊ฑฐํ๋ ์ญํ ์ ํฉ๋๋ค. ์ฝ๊ฒ ๋งํด, unredacted()๋ฅผ ์ฌ์ฉํ๋ฉด ์จ๊ฒจ์ก๋ ์ฝํ
์ธ ๋ฅผ ๋ค์ ๋ณด์ฌ์ฃผ๋ ๊ฒ๋๋ค!!
redacted(reason:)๋ก ์ฝํ ์ธ ๋ฅผ ๊ฐ๋ฆฐ ์ํ์์, ํ์ ๋ทฐ์์๋ง ํน์ ์ฝํ ์ธ ๋ฅผ ๋ณด์ด๊ณ ์ถ์ ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ์ฃ ?? ์๋ฅผ ๋ค์ด, ๋ถ๋ชจ ๋ทฐ์์ ํ๋ ์ด์คํ๋ ์คํ์ผ์ ์ ์ฉํ๋๋ผ๋ ํน์ ์์ ๋ทฐ๋ ๊ทธ๋๋ก ํ์๋๊ฒ ํ ์ ์์ต๋๋ค.
์์์ ๋ณธ ์์ ์ฝ๋์์ ๋ ์ด๋ฏธ์ง๋ฅผ ๋ณด์ฌ์ฃผ๋๋ก ํด๋ณผ๊น์?
struct ContentView: View {
var body: some View {
VStack(alignment: .leading, spacing: 30) {
VStack(alignment: .leading) {
Text("Email")
.font(.title3)
Text("jini@naver.com")
.font(.body)
}
VStack(alignment: .leading) {
Text("Password")
.font(.title3)
HStack(spacing: 60) {
Text("abcd1234")
.font(.body)
Image(systemName: "eye.circle")
.unredacted() // <--- ํ์ ๋ทฐ ๊ณ์ธต์์ .unredacted()
}
.redacted(reason: .placeholder) // <--- ์์ ๋ทฐ ๊ณ์ธต์์ .redacted()
}
}
}
}

์ด๋ ๊ฒ .unredacted()๋ก ์ค์ ํด์ค ์ด๋ฏธ์ง๋ ๋ค์ ํ์๋ฉ๋๋ค!
๋ฐ์ดํฐ ๋ก๋ฉ ์ ์ค์ผ๋ ํค์ผ๋ก ํ์ํ๊ธฐ
์ํผ ์ฒ์์ผ๋ก ๋์๊ฐ์(?) ๊ฐ๋ฐ ์ค์ธ ์ฑ์ ์๋ํด๋ดค๋ ์ฝ๋ ๊ฒฐ๊ณผ์ ์คํฌ๋ฆฐ์ท์ ๊ณต์ ๋๋ฆฝ๋๋ค..
๊ฒฐ๊ณผ ๋จผ์ ๋ด๋ณผ๊น์?!!! (ํ์ฌ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด๋ฌ์ ํ๋ฉด ์์ ์ด ์ฆ์ ์ํ์ ๋๋ค..)
๋จผ์ ๋ทฐ ์ํ๋ฅผ ๊ด๋ฆฌํ ์ด๊ฑฐํ๊ณผ ๋ณ์๋ฅผ ์ ์ธํด์ค๋๋ค.
enum ViewStatus {
case error
case loading
case loaded
}
@State var viewStatus: ViewStatus = .loading
์ผํญ์ฐ์ฐ์๋ฅผ ํ์ฉํด์ redacted์ ๋ทฐ ์ํ๊ฐ .loading์ด๋ผ๋ฉด .placeholder๋ก ํ์ํ๋๋ก ํด์ค๋๋ค.
ScrollView {
LazyVStack(spacing: sectionSpacing) {
popularQuestSection
recommendQuestSection
largestRewardQuestSection
userRankingSection
}
.redacted(reason: viewStatus == .loading ? .placeholder : [])
}
์์ ์ ์ฉํ๊ธฐ
์ฑ์ ์ ์ฉํ๋ค๋ณด๋ฉด ๋ทฐ๋ ์ด๋ฏธ์ง์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์์ ์ค์ ํด๋์ง ์์ผ๋ฉด ํ๋ ์ด์คํ๋๊ฐ ์ฝํ ์ธ ๋ฅผ ์ธ์ํ์ง ๋ชปํ๊ณ ํฌ๋ช ํ๊ฒ ๋ณด์ด๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ํด๋น ๋ทฐ์ ๋ฐฑ๊ทธ๋ผ์ด๋๋ฅผ ์ค์ ํด์ค๋ ๋๊ณ , ์๋์ฒ๋ผ ๋ทฐ์ ๋ชจ๋ํ์ด์ด๋ฅผ ๋ฌ์์ค๋ ๋๋ค.
@Environment(\.redactionReasons) var redactionReasons
Image("image")
.foregroundStyle(redactionReasons.contains(.placeholder) ? .clear: Color.gray)
๋ฌด์กฐ๊ฑด ์ค์ผ๋ ํค ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋๊ฒ ์ฌ์ฉ์ ๊ฒฝํ์ ๋์์ด ๋ ๊น์?
์นด์นด์คํ์ด์ ์ด ๊ธ์ ์ธ์๊น๊ฒ ๋ด์ ๋งํฌ๋ฅผ ์ฒจ๋ถํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ถ์ฒ๋ ์๋์ง๋ง, ๋์ค์ ๋ค์ ๋ณด๊ธฐ ์ํด ๋จ๊ธฐ๋ ๊ธ๊ณผ ์คํ์ค๋ฒํ๋ก์ฐ..
'๐ Apple > SwiftUI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ด์ ์ ํญ์ ProgressVew๋ก ๋ก๋ฉ์ค์ธ ํ๋ฉด์ ๊ตฌํํ์๋๋ฐ, ํ ํญ์ ๊ตฌํํ๋ฉด์ .redacted๋ฅผ ์ฌ์ฉํด๋ณด๊ณ ์ถ์๋ค.
์ฑ์ ์ ์ฉํ ์ง๋ ํ์คํ์ง ์์ง๋ง,, ๊ฐ๋จํ๊ฒ ๊ธฐ๋กํ๊ณ ์ ์์ฑํ๋ค.
redacted๋?
๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด, redacted๋ ์ปจํ ์ธ ๋ฅผ ๊ฐ๋ ค์ฃผ๋ ๋ฉ์๋์ ๋๋ค.
๊ณต์ ๋ฌธ์๋ฅผ ๋ณด๊ธฐ ์ ์ ์ค๋ช ์ด ์๋ฟ๋์?
(์๋์!!!!?)

๋จ์ด๋ถํฐ ์ดํดํ๊ณ ๊ฐ์๋ฉด, ์ด ๊ธ์์ ์ค๋ช ๋์ด์๋ ๊ฒ ์ฒ๋ผ ๊ธฐ๋ฐ ๋๋ ๋ฏผ๊ฐํ ๋ด์ฉ์ ์ง์ฐ๋ค๋ผ๋ ๋ป์ ๊ฐ๊ณ ์์ต๋๋ค.
๊ทธ๋์ reason์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ฆฌ๊ธฐ ์ํ ์ด์ ๋ฅผ ๊ฐ์ด ์์ฑํด์ฃผ๋ ๊ฑฐ๊ฒ ์ฃ ?

redacted ์ฌ์ฉํด๋ณด๊ธฐ
์ผ๋จ RedactionReasons์๋ ํ์ฌ 3๊ฐ์ง๊ฐ ์กด์ฌํฉ๋๋ค.

๊ฐ๊ฐ ์ฌ์ฉ์ ๋ํด์๋ ์ฌ๊ธฐ์ ๋ ์๋ ค๋๋ฆฌ๊ฒ ์ต๋๋ค!!
3๊ฐ์ง ์ค์์ placeholder๋ฅผ ์ฌ์ฉํด์ ์ค์ผ๋ ํค ๋ทฐ๋ฅผ ๋ง๋ค์ด๋ด ์๋ค!!!
struct ContentView: View {
var body: some View {
VStack(alignment: .leading, spacing: 30) {
VStack(alignment: .leading) {
Text("Email")
.font(.title3)
Text("jini@naver.com")
.font(.body)
}
VStack(alignment: .leading) {
Text("Password")
.font(.title3)
HStack(spacing: 60) {
Text("abcd1234")
.font(.body)
Image(systemName: "eye.circle")
}
.redacted(reason: .placeholder) // <-- ์ฌ๊ธฐ
}
}
}
}
์ด๋ ๊ฒ .redacted(reason: .placeholder)๋ฅผ ์์ฑํด์ฃผ๋ฉด ์๋์ ์ค๋ฅธ์ชฝ ์ด๋ฏธ์ง์ฒ๋ผ ํจ์ค์๋๊ฐ ๊ฐ๋ ค์ง๋๋ค.

unredacted๋?

๋ฌธ์๋ฅผ ์ดํด๋ณด๋ฉด unredacted()๋ผ๋ ๋ฉ์๋๋ ๋ฐ๊ฒฌํ ์ ์์ต๋๋ค. ์ด ๋ฉ์๋๋ ๋ทฐ ๊ณ์ธต์ ์ ์ฉ๋ redacted ์ํ๋ฅผ ์ ๊ฑฐํ๋ ์ญํ ์ ํฉ๋๋ค. ์ฝ๊ฒ ๋งํด, unredacted()๋ฅผ ์ฌ์ฉํ๋ฉด ์จ๊ฒจ์ก๋ ์ฝํ
์ธ ๋ฅผ ๋ค์ ๋ณด์ฌ์ฃผ๋ ๊ฒ๋๋ค!!
redacted(reason:)๋ก ์ฝํ ์ธ ๋ฅผ ๊ฐ๋ฆฐ ์ํ์์, ํ์ ๋ทฐ์์๋ง ํน์ ์ฝํ ์ธ ๋ฅผ ๋ณด์ด๊ณ ์ถ์ ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ์ฃ ?? ์๋ฅผ ๋ค์ด, ๋ถ๋ชจ ๋ทฐ์์ ํ๋ ์ด์คํ๋ ์คํ์ผ์ ์ ์ฉํ๋๋ผ๋ ํน์ ์์ ๋ทฐ๋ ๊ทธ๋๋ก ํ์๋๊ฒ ํ ์ ์์ต๋๋ค.
์์์ ๋ณธ ์์ ์ฝ๋์์ ๋ ์ด๋ฏธ์ง๋ฅผ ๋ณด์ฌ์ฃผ๋๋ก ํด๋ณผ๊น์?
struct ContentView: View {
var body: some View {
VStack(alignment: .leading, spacing: 30) {
VStack(alignment: .leading) {
Text("Email")
.font(.title3)
Text("jini@naver.com")
.font(.body)
}
VStack(alignment: .leading) {
Text("Password")
.font(.title3)
HStack(spacing: 60) {
Text("abcd1234")
.font(.body)
Image(systemName: "eye.circle")
.unredacted() // <--- ํ์ ๋ทฐ ๊ณ์ธต์์ .unredacted()
}
.redacted(reason: .placeholder) // <--- ์์ ๋ทฐ ๊ณ์ธต์์ .redacted()
}
}
}
}

์ด๋ ๊ฒ .unredacted()๋ก ์ค์ ํด์ค ์ด๋ฏธ์ง๋ ๋ค์ ํ์๋ฉ๋๋ค!
๋ฐ์ดํฐ ๋ก๋ฉ ์ ์ค์ผ๋ ํค์ผ๋ก ํ์ํ๊ธฐ
์ํผ ์ฒ์์ผ๋ก ๋์๊ฐ์(?) ๊ฐ๋ฐ ์ค์ธ ์ฑ์ ์๋ํด๋ดค๋ ์ฝ๋ ๊ฒฐ๊ณผ์ ์คํฌ๋ฆฐ์ท์ ๊ณต์ ๋๋ฆฝ๋๋ค..
๊ฒฐ๊ณผ ๋จผ์ ๋ด๋ณผ๊น์?!!! (ํ์ฌ ๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด๋ฌ์ ํ๋ฉด ์์ ์ด ์ฆ์ ์ํ์ ๋๋ค..)
๋จผ์ ๋ทฐ ์ํ๋ฅผ ๊ด๋ฆฌํ ์ด๊ฑฐํ๊ณผ ๋ณ์๋ฅผ ์ ์ธํด์ค๋๋ค.
enum ViewStatus {
case error
case loading
case loaded
}
@State var viewStatus: ViewStatus = .loading
์ผํญ์ฐ์ฐ์๋ฅผ ํ์ฉํด์ redacted์ ๋ทฐ ์ํ๊ฐ .loading์ด๋ผ๋ฉด .placeholder๋ก ํ์ํ๋๋ก ํด์ค๋๋ค.
ScrollView {
LazyVStack(spacing: sectionSpacing) {
popularQuestSection
recommendQuestSection
largestRewardQuestSection
userRankingSection
}
.redacted(reason: viewStatus == .loading ? .placeholder : [])
}
์์ ์ ์ฉํ๊ธฐ
์ฑ์ ์ ์ฉํ๋ค๋ณด๋ฉด ๋ทฐ๋ ์ด๋ฏธ์ง์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์์ ์ค์ ํด๋์ง ์์ผ๋ฉด ํ๋ ์ด์คํ๋๊ฐ ์ฝํ ์ธ ๋ฅผ ์ธ์ํ์ง ๋ชปํ๊ณ ํฌ๋ช ํ๊ฒ ๋ณด์ด๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ํด๋น ๋ทฐ์ ๋ฐฑ๊ทธ๋ผ์ด๋๋ฅผ ์ค์ ํด์ค๋ ๋๊ณ , ์๋์ฒ๋ผ ๋ทฐ์ ๋ชจ๋ํ์ด์ด๋ฅผ ๋ฌ์์ค๋ ๋๋ค.
@Environment(\.redactionReasons) var redactionReasons
Image("image")
.foregroundStyle(redactionReasons.contains(.placeholder) ? .clear: Color.gray)
๋ฌด์กฐ๊ฑด ์ค์ผ๋ ํค ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋๊ฒ ์ฌ์ฉ์ ๊ฒฝํ์ ๋์์ด ๋ ๊น์?
์นด์นด์คํ์ด์ ์ด ๊ธ์ ์ธ์๊น๊ฒ ๋ด์ ๋งํฌ๋ฅผ ์ฒจ๋ถํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ถ์ฒ๋ ์๋์ง๋ง, ๋์ค์ ๋ค์ ๋ณด๊ธฐ ์ํด ๋จ๊ธฐ๋ ๊ธ๊ณผ ์คํ์ค๋ฒํ๋ก์ฐ..