-
[TIL w3d1] Swift 복습 (Optional, 중첩타입, 접근제어자, Protocol)iOS💖 2025. 3. 17. 20:29
학습 목표
Optional, Optional unwrapping, 중첩타입, 접근제어자, 프로토콜을 iOS 개발에 실제 활용할 수 있도록 학습!
문법의 특징을 잘 파악해보자!
Optional Type
선언 가능 타입
- 기본 타입 (Int, String, Float … )
- Collection Type (Array, Dictionary, Set … )
- Custom Type (Class, Struct, Enum)
- 클로저
Optional Chaining: 체이닝으로 optional 벗기기!
person?.animal?.name⭐️ nil 확인 : 왼쪽 -> 오른쪽으로 체크 ⭐️
Optional Binding: if-let / guard-let
[1] if-let
var intValue: Int? = 10 if let intValue = intValue { print(intValue) // 10 } print(intValue) // Optional(10)[2] guard-let
: [2.1] 조건문 [2.2] 옵셔널 unwrapping[2.1] 조건문
- guard 는 조건이 true일 경우 코드를 계속 진행하고, false일 경우 else 코드 블록에서 탈출
- else 블록은 필수
guard 조건 else { // 조건이 false 일 때 실행되는 코드블록 // return, break, continue, throw등 코드블록을 종료하는 구문이 필요 return }[2.2] 옵셔널 binding으로 unwrapping
- 옵셔널 바인딩 결과가 nil일 경우, else 문을 실행
- 클로저 / 메소드 내부에서 주로 사용
옵셔널 묵시적 언래핑 (Implicitly Unwrapped Optional)
- 옵셔널 타입을 선언할 때 !를 사용
- 값을 사용할 때 자동으로 언래핑되어, 별도의 언래핑 작업 없이 직접 사용 가능
- 🔴 값이 있다고 확신이 들 때 사용!!
- 값이 nil 일 때 접근하면 런타임 오류가 발생
- 값이 nil 일 때 접근하면 런타임 오류가 발생
- 옵셔널 바인딩 가능
var name: String! = "Dive" print(name) // Optional("Dive") print(name.count) // 5 if let name = name { print(name) // Dive }중첩된 타입
: 구조적 복잡한 Class / Struct 를 더 조직적 관리!- 사용 : class, struct, enum 등
- 코드 가독성을 높이고, 타입 간의 연관성을 명확해짐!
struct Car { struct Company { var name: String var phoneNumber: String func contact() { print("\(name) 회사의 A/S 센터 번호는 \(phoneNumber)입니다.") } } enum Model { case sedan case hatchback case suv } var model: Model var company: Company var name: String var color: String } let myCar = Car(model: .sedan, company: Car.Company(name: "sparta", phoneNumber: "010-0000-0000"), name: "붕붕이", color: "Black") myCar.company.contact() // sparta 회사의 A/S 센터 번호는 010-0000-0000입니다. print(myCar.model) // sedan접근제어자
: open, public, internal, fileprivate, privateopen
- 모든 외부 모듈에서 접근할 수 있는 접근제어자
- 가장 개방적인 접근 수준
- 유일하게 class 에서만 사용 가능
- 상속이 가능하고 재정의 가능하기 때문에!
- 상속이 가능하고 재정의 가능하기 때문에!
public
- 모든 외부 모듈에서 접근할 수 있는 접근제어자
- 가장 개방적인 접근 수준
internal
- 기본값 접근제어자로 설정하지 않았다면 internal
- 동일한 모듈에서 접근 가능
fileprivate
- 동일한 파일 내부에서만 접근할 수 있는 접근 제어자
private
- 가장 제한적인 접근 제어자
- 해당 요소를 선언한 스코프(예를 들어 class, struct, enum의 코드블록)에서만 사용 가능
- struct 에서 private 프로퍼티가 있다면 memberwise init을 사용할 수 없어서 직접 init을 작성해야 합니다.
struct Person { var name: String public var age: Int private var havingMoney: Int // 🔴 private property init(name: String, age: Int, havingMoney: Int) { // 🔴 init 직접 작성 self.name = name self.age = age self.havingMoney = havingMoney } private func printMoney() { print("나는 \(havingMoney) 원 있다!") } func test() { printMoney() } }프로토콜
: { get } / { set get } 에 따른 구현- 🔴 protocol에 선언된 property를 구현할 경우, [저장 프로퍼티] / [연산 프로퍼티] 로 구현하든 상관 X
- 🔴 연산 프로퍼티는, 원래 var 선언
[1] { get } 프로퍼티
- [저장 프로퍼티] : let/var 상관 X ('get'으로 수정안되니)
- [연산 프로퍼티] : protocol 이 get 임에도,
- get {} 구현 (O)
- get {} set {} 구현 (O)
protocol P1 { var property: String { get } }[2] { get set } 프로퍼티
- [저장 프로퍼티] : 반드시 var 선언 (set 으로 수정 가능하니)
- [연산 프로퍼티] : protocol 이 get 임에도,
- get {} 만 구현 (X)
- get {} set {} 모두 필수!!! 구현 (O)
protocol P2 { var property: String { get set } }클래스 전용 프로토콜
: 정의 시, AnyObject를 채택!- struct, enum에서 사용될 수 X
- 프로토콜 정의 시, AnyObject를 채택하면 클래스 전용 프로토콜로 만들어짐
protocol OnlyClassProtocol: AnyObject { }'iOS💖' 카테고리의 다른 글
[TIL w3d4] Swift 심화문법 CLI 프로젝트 (Feat. 👩🏻🔧트러블 슈팅) (0) 2025.03.20 [TIL w2d5] Swift 복습 (Enum, Property 🌺) (0) 2025.03.17 [TIL w2d4] Swift CLI 숫자 야구게임 (Feat. 🛠️트러블 슈팅) (0) 2025.03.14 [TIL w2d3] 알고리즘 Swift로 다시시작 / Swift 복습 (Struct) (0) 2025.03.13 [TIL w2d2] 알고리즘 특강 / 야구 게임 만들기 (Lv. 1~3 / 6) (0) 2025.03.11