버튼을 눌렀는데 텍스트가 안 바뀐다
struct CounterView: View {
@State private var count = 0
var body: some View {
VStack(spacing: 20) {
Text("\(count)")
.font(.system(size: 60, weight: .bold))
Button("+ 1") {
count += 1
}
.buttonStyle(.borderedProminent)
}
}
}
struct ParentView: View {
@State private var name = ""
var body: some View {
VStack {
Text("이름: \(name)")
ChildView(name: $name)
}
}
}
struct ChildView: View {
@Binding var name: String
var body: some View {
TextField("이름 입력", text: $name)
.textFieldStyle(.roundedBorder)
}
}
struct InputView: View {
@State private var email = ""
var body: some View {
VStack(alignment: .leading) {
Text("이메일")
.font(.caption)
.foregroundStyle(.secondary)
TextField("example@email.com",
text: $email)
.textFieldStyle(.roundedBorder)
.keyboardType(.emailAddress)
}
.padding()
}
}
struct SettingsView: View {
@State private var isDark = false
@State private var fontSize: Double = 16
var body: some View {
Form {
Toggle("다크 모드", isOn: $isDark)
VStack(alignment: .leading) {
Text("폰트 크기: \(Int(fontSize))")
Slider(value: $fontSize,
in: 12...24, step: 1)
}
}
}
}
struct Fruit: Identifiable {
let id = UUID()
let name: String
let emoji: String
}
struct FruitList: View {
@State private var fruits = [
Fruit(name: "사과", emoji: "🍎"),
Fruit(name: "바나나", emoji: "🍌"),
Fruit(name: "포도", emoji: "🍇"),
]
var body: some View {
List {
ForEach(fruits) { fruit in
HStack {
Text(fruit.emoji)
Text(fruit.name)
}
}
.onDelete { fruits.remove(atOffsets: $0) }
}
}
}
struct HomeView: View {
@State private var showSheet = false
var body: some View {
NavigationStack {
List {
NavigationLink("상세 보기") {
Text("Detail View")
}
}
.navigationTitle("홈")
.toolbar {
Button("추가") {
showSheet = true
}
}
.sheet(isPresented: $showSheet) {
Text("Sheet Content")
}
}
}
}
struct Todo: Identifiable, Codable {
let id: UUID
var title: String
var isCompleted: Bool
init(title: String) {
self.id = UUID()
self.title = title
self.isCompleted = false
}
}
// 저장
func save(_ todos: [Todo]) {
if let data = try? JSONEncoder()
.encode(todos) {
UserDefaults.standard
.set(data, forKey: "todos")
}
}
// 불러오기
func load() -> [Todo] {
guard let data = UserDefaults.standard
.data(forKey: "todos"),
let todos = try? JSONDecoder()
.decode([Todo].self, from: data)
else { return [] }
return todos
}
struct CounterView: View {
@State private var count = 0
var body: some View {
VStack(spacing: 24) {
Text("\(count)")
.font(.system(size: 72, weight: .bold))
.foregroundStyle(count < 0 ? .red : .primary)
HStack(spacing: 16) {
Button("-1") { count -= 1 }
.buttonStyle(.bordered)
Button("리셋") { count = 0 }
.buttonStyle(.bordered)
.tint(.gray)
Button("+1") { count += 1 }
.buttonStyle(.borderedProminent)
}
}
}
}
struct Todo: Identifiable, Codable {
let id: UUID
var title: String
var isCompleted: Bool
init(title: String) {
self.id = UUID()
self.title = title
self.isCompleted = false
}
}
struct TodoListView: View {
@State private var todos: [Todo] = []
@State private var newTitle = ""
var body: some View {
NavigationStack {
List {
ForEach($todos) { $todo in
HStack {
Image(systemName: todo.isCompleted
? "checkmark.circle.fill"
: "circle")
.foregroundStyle(
todo.isCompleted
? .blue : .gray)
.onTapGesture {
todo.isCompleted.toggle()
save()
}
Text(todo.title)
.strikethrough(
todo.isCompleted)
}
}
.onDelete { offsets in
todos.remove(atOffsets: offsets)
save()
}
}
.navigationTitle("할 일")
.toolbar {
ToolbarItem(placement: .bottomBar) {
HStack {
TextField("새 할 일",
text: $newTitle)
Button("추가") {
guard !newTitle.isEmpty
else { return }
todos.append(
Todo(title: newTitle))
newTitle = ""
save()
}
}
}
}
.onAppear { load() }
}
}
func save() {
if let data = try? JSONEncoder()
.encode(todos) {
UserDefaults.standard
.set(data, forKey: "todos")
}
}
func load() {
guard let data = UserDefaults.standard
.data(forKey: "todos"),
let saved = try? JSONDecoder()
.decode([Todo].self, from: data)
else { return }
todos = saved
}
}
struct SettingsView: View {
@State private var isDarkMode = false
@State private var fontSize: Double = 16
@State private var language = "한국어"
let languages = ["한국어", "English", "日本語"]
var body: some View {
NavigationStack {
Form {
Section("화면") {
Toggle("다크 모드",
isOn: $isDarkMode)
VStack(alignment: .leading) {
Text("폰트 크기: \(Int(fontSize))")
Slider(value: $fontSize,
in: 12...28, step: 1)
}
}
Section("언어") {
Picker("언어 선택",
selection: $language) {
ForEach(languages, id: \.self) {
Text($0)
}
}
}
Section {
PreviewCard(
isDarkMode: $isDarkMode,
fontSize: $fontSize)
}
}
.navigationTitle("설정")
}
}
}
struct PreviewCard: View {
@Binding var isDarkMode: Bool
@Binding var fontSize: Double
var body: some View {
Text("미리보기 텍스트")
.font(.system(size: fontSize))
.padding()
.frame(maxWidth: .infinity)
.background(isDarkMode ? .black : .white)
.foregroundStyle(isDarkMode ? .white : .black)
.cornerRadius(12)
}
}