안녕하세요 공공돌🧸 입니다. 💬 Button은 그냥 만들어졌는데 Toggle을 넣으려니 $ 붙은 값을 달라고 해서 막혔습니다. 같은 컨트롤인데 왜 요구하는 게 다른지 궁금해 정리했습니다.동작을 받는 컨트롤과 값을 받는 컨트롤지금까지 다룬 Text나 Image는 보여 주기만 하는 뷰였습니다. 컨트롤은 여기에 사용자 입력이 더해집니다. 그런데 입력을 다루는 방식이 두 갈래로 나뉩니다.구분컨트롤필요한 것동작만 알리면 되는 것Button눌렸을 때 실행할 코드값이 계속 오가는 것Toggle, TextField읽고 쓸 수 있는 값의 연결버튼은 "눌렸다"는 사실만 전하면 끝이지만, 스위치나 입력창은 현재 값을 보여 주면서 동시에 바뀐 값을 돌려줘야 합니다. 이 차이가 문법 차이로 나타납니다.ButtonButton..
안녕하세요 공공돌🧸 입니다. 💬 frame으로 버튼을 화면 가운데 놓았는데, 아이폰 SE에서는 맞고 프로 맥스에서는 왼쪽으로 치우쳤습니다. 화면 크기마다 좌표를 계산해 넣을 수는 없어서 Auto Layout을 정리했습니다.좌표 대신 관계를 적는다frame은 "왼쪽에서 20, 위에서 100, 너비 200"처럼 숫자를 직접 정하는 방식입니다. 화면 크기가 바뀌면 그 숫자를 다시 계산해야 합니다.Auto Layout은 대신 뷰 사이의 관계를 적어 둡니다. "이 버튼의 가운데는 화면의 가운데와 같다"처럼 적어 두면, 화면이 얼마든 시스템이 좌표를 계산해 줍니다.방식적는 것화면이 바뀌면frame최종 좌표와 크기직접 다시 계산Auto Layout뷰 사이의 관계시스템이 다시 계산제약은 하나의 관계식이다제약(Con..
안녕하세요 공공돌🧸 입니다. 💬 화면 상태를 String으로 관리하다가 "loading"을 "Loading"으로 잘못 적어 분기가 통째로 빗나간 적이 있습니다. 값이 몇 가지로 정해져 있다면 애초에 다른 값을 못 쓰게 막으면 되는데, 그 도구가 열거형(Enumeration)이었습니다.값의 목록을 타입으로 만들기열거형은 가능한 경우를 미리 나열해 둔 타입입니다. 나열한 case 말고는 만들 수 없으니, 오타나 예상 밖의 값이 애초에 컴파일 단계에서 걸립니다.방식가능한 값오타가 나면String으로 상태 관리무한실행 중에야 발견열거형으로 상태 관리나열한 것뿐컴파일 에러문법과 예시enum 뒤에 타입 이름을 쓰고, 각 경우를 case로 나열합니다.enum Direction { case north c..
안녕하세요 공공돌🧸 입니다. 지금까지 스택과 여백으로 배치를 다뤘습니다. 이제 그 안에 실제로 채울 내용, 즉 글자와 이미지를 볼 차례입니다. SwiftUI에서 가장 많이 쓰는 두 뷰가 Text와 Image입니다.Text문자열을 그대로 넣으면 됩니다. 문자열 보간도 그대로 쓸 수 있습니다.Text("안녕하세요")let name = "지훈"Text("반가워요, \(name)")자주 쓰는 수정자는 다음과 같습니다.Text("긴 제목이 들어가는 자리입니다") .font(.title) // 글자 크기·굵기 .foregroundStyle(.blue) // 글자 색 .lineLimit(2) // 최대 두 줄까..
안녕하세요 공공돌🧸 입니다. 앞서 UIViewController가 하나의 화면을 관리한다고 했습니다. 그런데 UINavigationController처럼 다른 뷰컨트롤러들을 담아 관리하는 뷰컨트롤러도 있습니다. 이를 컨테이너 ViewController라고 합니다.화면을 담는 화면컨테이너는 스스로 콘텐츠를 그리지 않고, 자식 뷰컨트롤러를 담아 배치와 전환만 담당합니다. UIKit이 기본으로 주는 것들이 이미 컨테이너입니다.컨테이너담는 방식UINavigationController스택처럼 쌓고 뒤로 빼기UITabBarController탭으로 화면 전환UIPageViewController좌우로 넘기는 페이지우리가 직접 컨테이너를 만들 수도 있습니다. 화면 절반은 지도, 절반은 목록처럼 한 화면 안에 독립된 화..
안녕하세요 공공돌🧸 입니다. 함수는 이름을 붙여 두고 여러 번 부르는 도구입니다. 그런데 "여기서 한 번만 쓸 짧은 코드"에 매번 이름을 붙이는 건 번거롭습니다. 이럴 때 쓰는 것이 클로저(Closure)입니다.이름 없는 함수클로저는 이름 없는 함수입니다. 이름이 없으니 변수에 담거나, 다른 함수의 인자로 넘길 수 있습니다.구분이름주로 쓰는 곳함수있음여러 곳에서 반복 호출클로저없음그 자리에서 한 번 쓰는 짧은 코드문법과 예시기본 형태는 중괄호 안에 파라미터와 실행 코드를 in으로 구분해 씁니다.let add = { (a: Int, b: Int) -> Int in return a + b}add(2, 3) // 5{ } 클로저의 몸통(a: Int, b: Int) -> Int 입력과 반환 타입in ..