프로토콜(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

+ Recent posts