URL 구조체

여러 가지 애플리케이션과 브라우저를 띄울 수 있다.
함수를 찾았을 때 진한 색으로 나오는 경우 반드시 써야하고
흐린 색으로 나오는 경우에는 default 값이 정해져 있어 굳이 쓰지 않아도 된다.
한 번 쓰기 시작하면 계속 사용해야 해서 오른쪽에 붙어있다.

WebKit 자동 추가 안될 때 수동으로 추가하는 방법
프로젝트 네비게이터에서 프로젝트 폴더 좌클릭 - Build Phases - +클릭 - Webkit 프레임워크 추가



수평, 수직에 대해 얼마나 떨어뜨릴지 설정 가능. 휴대폰을 회전시켰을 때도 앱의 기능과 버튼들이 제대로 된 위치에 놓일 수 있도록 한다.
아이폰이든 아이패드든 0,0에 두게 되면 항상 정가운데에 있게 해준다.
버튼이 많지 않고 하나만 있을 때에는 이렇게 해도 괜찮지만
실무에서 제대로 쓰이는 앱의 화면 상 버튼이나 레이블이 한두 개가 아니기 때문에 여러가지를 잡고 스택 뷰에 넣어놓으면
그 스택뷰 하나에 대해서만 간격을 설정해두면 어렵지 않게 작업할 수 있다.

AutoLayout을 사용하는 법 - 뤼튼
Xcode에서 오토레이아웃 하는 법!
1. 뷰 배치하기 (기본)
먼저 스토리보드나 XIB 파일에서 화면에 UILabel이든 UIButton이든 필요한 뷰들을 원하는 위치에 대충 드래그해서 올려놔.
2. 제약조건(Constraints) 추가하기 (핵심!)
뷰를 선택하고 Xcode 화면 오른쪽 아래에 있는 세 가지 버튼을 주로 사용하게 될 거야.
1) Pin 버튼 (상하좌우 간격, 크기 조절)
- 핀 모양 아이콘 (네모 안에 짝대기 4개 있는 거)
- 용도: 선택한 뷰의 상하좌우 간격(Top, Bottom, Leading, Trailing)과 크기(Width, Height)를 설정할 때 써.
- 예시: "이 버튼은 화면 위에서 20pt 떨어지고, 왼쪽에서 16pt 떨어지게 해줘."
- 간격 설정: 보통 Safe Area 기준으로 많이 설정해.
- 크기 설정: Width, Height에 고정값을 줄 수도 있고, 다른 뷰와의 비율로 설정할 수도 있어.
- Add N Constraints 버튼을 누르면 설정이 적용돼.
2) Align 버튼 (정렬)
- 두 번째 아이콘 (네모 두 개가 겹쳐진 거)
- 용도: 뷰들을 서로 정렬할 때 사용해.
- 예시: "이 버튼을 화면 정중앙에 배치해줘.", "얘랑 얘랑 수평으로 맞춰줘."
- Horizontally in Container (컨테이너 중앙 가로), Vertically in Container (컨테이너 중앙 세로) 가 많이 쓰여.
3) Resolve Auto Layout Issues 버튼 (문제 해결)
- 세 번째 아이콘 (빨간색 동그라미 안에 화살표 같은 거)
- 용도: 오토레이아웃 설정하다 보면 빨간색/주황색 줄이 막 생기면서 경고나 에러가 뜰 때가 있어. 그때 이 버튼을 눌러서 해결할 수 있어.
- Update Frames: 현재 제약조건에 맞춰 뷰의 실제 크기와 위치를 업데이트해줘. (제약조건 다 추가한 후 항상 한 번씩 눌러주는 습관 들이면 좋음!)
- Add Missing Constraints: Xcode가 알아서 빠진 제약조건을 채워주는 기능인데, 이건 생각만큼 똑똑하진 않으니 직접 설정하는 걸 추천해 ㅠㅠ
3. 제약조건 확인 및 수정
뷰를 선택한 다음, Xcode 오른쪽 패널의 Size Inspector (측정자 모양 아이콘) 탭으로 가면 해당 뷰에 적용된 제약조건 리스트를 볼 수 있어. 여기서 제약조건 값을 바꾸거나 지울 수 있어.
4. Stack View 활용하기 (꿀팁!)
여러 뷰를 일렬로 나열하거나 정렬해야 할 때 UIStackView를 사용하면 오토레이아웃 잡기가 엄청 쉬워져. Stack View 안에 뷰들을 넣으면 알아서 간격이나 정렬을 관리해주거든. 복잡한 UI 만들 때 이거 모르면 진심 고생한다 ㅠㅠ
- 뷰들을 여러 개 선택한 후, 아래 오토레이아웃 버튼 중 오른쪽 하단 끝에서 두 번째 아이콘 (Embedding in Stack View) 을 누르면 돼.
⚠️ 오토레이아웃 할 때 주의할 점!
- 모든 축(X, Y)과 크기(Width, Height)가 정의되어야 해: 뷰 하나가 화면에서 어디에 위치하고 얼마나 커야 하는지 오토레이아웃이 헷갈리지 않게 모든 정보를 줘야 해. 이게 부족하면 오류(빨간 줄)가 뜨는 경우가 많음.
- 충돌하는 제약조건 주의: "얘는 왼쪽에서 10pt, 근데 동시에 오른쪽에서 20pt?" 이렇게 말이 안 되는 제약조건을 주면 충돌 에러(빨간 줄)가 생겨.
- 프레임 업데이트: 제약조건을 추가/수정한 후에는 꼭 Update Frames를 눌러서 뷰의 실제 표시가 제약조건대로 되는지 확인하는 습관을 들이자!
**** present 함수 ****
1. present 함수란?
present는 스위프트(iOS 개발)에서 한 화면(뷰 컨트롤러) 위에 다른 화면을 모달(덮어씌우듯)로 띄울 때 사용하는 함수야.
즉, 현재 화면에서 튀어나와서 새 화면이 전체 또는 일부를 덮는 방식.
예) 설정 화면, 로그아웃 확인 팝업, 알림창 이런 거 모달 화면으로 많이 쓰지.
2. 함수 시그니처
swift
func present(
_ viewControllerToPresent: UIViewController, // 띄울 새 화면 (뷰 컨트롤러)
animated flag: Bool, // 애니메이션 유무 (애니메이션할지 말지)
completion: (() -> Void)? = nil // 화면 뜬 뒤 실행할 코드 (옵셔널)
)
- viewControllerToPresent : 새로 보여줄 화면을 객체로 넘겨줘야 함. 보통 UIViewController를 상속한 화면 클래스 인스턴스.
- animated : true면 화면 전환 애니메이션 생김, false면 바로 뽝.
- completion : 모달 전환이 끝난 후 추가 실행할 코드(클로저)를 넣을 수 있어. 안 써도 돼.
3. 왜 모달 방식일까?
- 모달은 현재 작업을 잠시 멈추고(기존 화면과 독립적) 새 작업을 처리하게 해줌.
- 새 화면 닫을 때는 dismiss(animated:completion:)으로 다시 이전 화면으로 돌아가.
- 화면이 완전히 겹치는 경우가 많아서 유저가 새 작업 끝내기 전까지 기존 화면 건드릴 수 없게 만드는 용도.
4. 실제 사용법 예시
swift
// 새 화면 인스턴스 생성
let detailViewController = DetailViewController()
// 현재 화면에서 모달로 새 화면 띄우기
present(detailViewController, animated: true) {
print("새 화면이 성공적으로 떴어!")
}
위 예시는 UIViewController 내부에서 호출하는 상황 가정
5. 사용하는 환경 팁
- 스토리보드 쓰면 뷰 컨트롤러를 식별자(ID)로 불러서 쓸 수 있어:
swift
let storyboard = UIStoryboard(name: "Main", bundle: nil)
if let detailVC = storyboard.instantiateViewController(withIdentifier: "DetailVC") as? DetailViewController {
present(detailVC, animated: true, completion: nil)
}
- 만약 present로 띄운 화면 안에서 다시 이전 화면으로 돌아가려면 이렇게 dismiss 호출해야:
swift
self.dismiss(animated: true, completion: nil)
6. present와 push 차이
- present: 화면을 덮으며 모달 방식 전환 (닫을 때 dismiss 필요)
- push: 내비게이션 스택에 쌓으면서 화면 이동 (뒤로가기 버튼으로 돌아감)
push는 UINavigationController가 있을 때 쓸 수 있고,
present는 뷰 컨트롤러 간 독립적 전환할 때 주로 써.
7. 요약
변수명역할설명| viewControllerToPresent | 새 화면 | 띄우고자 하는 UIViewController 객체 |
| animated | 애니메이션 여부 | 화면 전환 시 애니메이션 포함 여부 (true or false) |
| completion | 완료 후 처리 | 화면 전환 완료 시 실행할 코드(옵셔널) |
이렇게 present는 iOS에서 아주 기본적이고 자주 쓰이는 화면 전환 방식이야.
처음엔 헷갈려도 계속 써봐! 화면 띄우고 닫는 흐름 감 잡히면 진짜 편함.

이 기본 소스에서 저 상태로 엔터를 누르게 되면 아래 화면처럼 바뀌게 되는데

후행 클로저의 형태이다.
이렇게 하면 기능 상 동영상이 나올 준비가 모두 끝마치게 되면 자연스럽게 동영상이 시작되도록 한다.

기능은 다 같지만 마지막 후행 클로저가 가장 좋은 방법.
self.은 있어도 되고 없어도 됨
let multiply = {(a: Int, b: Int) -> Int in
return a * b
}
var result = multiply(10, 20)
print(result)
let add = {(a: Int, b: Int) -> Int in
return a + b
}
result = add(10, 20)
print(result)
func math(x: Int, y: Int, cal: (Int, Int) -> Int) -> Int {
return cal(x, y)
}
result = math(x: 10, y: 20, cal: add)
print(result)
result = math(x: 10, y: 20, cal: multiply)
print(result)
result = math(x: 10, y: 20, cal: {$0 + $1})
//첫 번째와 두 번째 더하기, 단축인자라고 한다.
print(result)
shorthand argument name 이라고도 한다. 코드를 최대한 간편하게 만들어준다.
