프로토콜(Protocols)
프로토콜은 메서드, 프로퍼티, 그리고 특정 작업이나 기능의 부분이 적합한 다른 요구사항의 청사진을 정의합니다.
프로토콜 안에는 선언만 하고, 구현부분에서 해당 변수나 메서드를 구현합니다.
또한 여러 프로토콜을 채택할 수 있습니다.
protocol Named {
var fullName: String { get }
func introduce()
}
protocol Aged {
var age: Int { get }
}
class Human: Named, Aged {
var age: Int = 10
var fullName: String = "Kim Cheol Su"
func introduce() {
print("hi i am \(fullName)")
}
}
프로토콜에 선언되는 변수와 메서드는 다음과 같습니다.
protocol SomeProtocol {
// gettable settable
var someProperty1: String { get }
var someProperty2: String { get set }
static var someProperty3: String { get set }
// Method
func someMethod1()
func someMethod2() -> String
static func someMethod3() -> String
mutating func someMethod4() -> String
//initializer
init()
}
class SomeCalss: SomeProtocol {
required init() { }
}
타입으로 사용되는 프로토콜
프로토콜은 선언만으로 기능을 수행하지 않습니다. 이런 점에서 프로토콜은 타입으로도 사용할 수 있습니다.
protocol TableItemPresentable {
var id: String { get }
var title: String { get }
var imageURL: String? { get }
mutating func configure()
}
struct TableItem: TableItemPresentable {
var id: String = "TableItem"
var title: String = "TableItem"
var imageURL: String? = nil
mutating func configure() {
self.title = "TableView Item"
}
}
struct CollectionItem: TableItemPresentable {
var id: String = "CollectionItem"
var title: String = "CollectionItem"
var imageURL: String? = nil
mutating func configure() {
self.title = "CollectionView Item"
}
}
var items: [TableItemPresentable] = [TableItem(), CollectionItem()]
print(items[0].title)
print(items[1].title)
// 출력
// TableItem
// CollectionItem
확장으로 프로토콜의 요구사항을 준수할 수 있습니다.
protocol Favorite {
func introduce() -> String
}
class Human {
var favoriteName: String
init(favoriteName: String) {
self.favoriteName = favoriteName
}
}
extension Human: Favorite {
func introduce() -> String {
print("my favorite is \(favoriteName)")
}
}
프로토콜의 요구사항을 선택적으로 만들기
프로토콜은 선언시 요구사항을 충족해야만 합니다.
프로토콜의 프로퍼티나 메서드의 요구사항을 구현할 때, 해당 구현부분에서 불필요하게 구현하게 될 수 있습니다.
그래서 해당 메서드나 프로퍼티를 옵셔널로 구현할 수 있습니다.
@objc protocol Information {
var name: String { get set }
@objc optional func introduce()
}
class Human: Information {
var name: String
init(name: String) {
self.name = name
}
func introduce() {
print("hi i am \(name)")
}
}
class Desk: Information {
var name: String
init(name: String) {
self.name = name
}
}
사람과 책상을 하나의 프로토콜을 묶었을 때, 책상은 말을 할 수 없으므로 introduce 메서드가 필요하지 않습니다.
이때 @objc optional 키워드를 붙여 해당 요구사항이 선택적으로 구현될 수 있도록 설정합니다.
요구사항이 선택적으로 구성된 경우 protocol 앞에 optional 키워드를 추가해야합니다.
또한 @objc 키워드가 추가되면 클래스에만 상속할 수 있습니다.
'Swift > 문법' 카테고리의 다른 글
후행 클로저 (0) | 2025.03.21 |
---|---|
enum의 다른 사용방법 (0) | 2025.03.14 |
Swift 구조체와 클래스 (0) | 2025.02.12 |
Swift Concurrency 정리 (7) | 2024.11.10 |
Swift 프로토콜 번역(추가 번역중) (Swift.org) (1) | 2024.02.11 |