프로토콜 (Protocol)
- 특정 기능을 정의하고, 여러 타입(struct, class, enum)에서 이를 구현하도록 강제하는 일종의 규칙
1. 기본
protocol Vehicle {
var brand: String
var model: String
var Int: String
func displayInfo()
}
class Car : Vehicle {
var brand: String
var model: String
var year: Int
init(brand: String, model: String, year: Int){
self.brand = brand
self.model = model
self.year = year
}
func displayInfo(){
print("brand : \(brand), model : \(model), year : \(year)")
}
}
2. 프로퍼티 요구사항
protocol Identifiable {
var id: String { get }
var name: String { get set }
}
struct User: Identifiable {
let id: String // 읽기(get) 전용이므로 let 만 가능
var name: String // 읽기 쓰기 가능
}
var user = User(id: "1234", name: "Alice")
print(user.id) // 1234
user.name = "Iris"
print(user.name) // "Iris"
3. some [프로토콜]
- 불투명 반환 타입으로 컴파일러가 내부적으로 타입을 추론하여 반환
- some이 반환하는 타입은 고정된 타입이므로 반환하는 타입은 항상 동일해야 함
- 반환 타입을 구체적으로 명시하지 않고, 특정 프로토콜을 따르는 타입임을 보장하는 기능
- 주로 protocol을 반환할 때 사용하며, SwiftUI에서 some View로 자주 사용됨.
struct ContentView: View {
var body : some View {
Text("Hello")
.font(.title)
.foregrountColor(.blue)
}
}
struct Bicyle : Vehicle {
var brand: String
var model: String
var year: Int
init(brand: String, model: String, year: Int){
self.brand = brand
self.model = model
self.year = year
}
func displayInfo(){
print("brand : \(brand), model : \(model), year : \(year)")
}
}
func createCar() -> some Vehicle {
return Car(brand:"KIA", model: "NIRO", year: 2025)
}
createCar() // Vehicle의 프로토콜을 지키는건 다 가능
익스텐션 (Extension)
- 기존에 제공되는 모듈에 기능을 추가하여 확장
- 클래스, 구조체 열거형, 프로토콜 다 가능
- 저장 프로퍼티는 추가 불가능하지만, 연산 프로퍼티는 가능
extension 에서 저장 프로퍼티 추가 불가능한 이유?
extension은 기존 타입(struct, class, enum)을 확장하는 기능이지만, 저장 프로퍼티를 추가하면 기존 인스턴스의 메모리 구조가 변경되어야 한다. 이미 생성된 인스턴스의 메모리 구조를 변경하는 것은 안전하지 않기 때문에 Swift에서 금지된다.
연산 프로퍼티는 기존 프로퍼티를 기반으로 동작하는 계산된 값이므로 메모리 구조를 변경하지 않기에 가능하다.
구조체
extension Int {
var isEven: Bool {
return self % 2 == 0
}
}
let num: Int = 4
if num.isEven {
print("짝수")
}else{
print("홀수")
}
클래스
class Car {
var brand: String
init(brand: String) {
self.brand = brand
}
}
extension Car {
fun drive(){
print("\(brand) 자동차가 주행 중입니다")
}
}
let myCar = Car(brand: "Tesla")
myCar.drive() // "Tesla 자동차가 주행 중입니다"
열거형
enum Direction {
case north, south, east, west
}
extension Direction {
func description() -> String {
switch self {
case .north: return "북"
case .south: return "남"
case .east: return "동"
case .west: return "서"
}
}
}
let dir = Direction.east
print(dir.description()) //동
'개발 > swift' 카테고리의 다른 글
[swift] 상태관리도구 (EnvironmentObject, ObservableObject, state) (0) | 2025.04.11 |
---|---|
[swift] Codable & Hashable & Identifiable (0) | 2025.04.04 |
[swift] swift 언어 정리 (3) - 클래스 & 구조체 & 열거형 (0) | 2025.03.15 |
[swift] swift 언어 정리 (2) - 함수 & 클로저 (0) | 2025.03.14 |
[swift] swift 언어 정리 (1) - 개념 & 문법 (0) | 2025.03.13 |