본문 바로가기

Apple/Swift

Swift 05 - 프로토콜(Protocol)

반응형

Swift 에서 프로토콜은 어떤 것이 가져야만 하는 어떤 프로퍼티와 메서드를 설명하는 방법이다. Swift에게 해당 프로토콜에서 사용하는 타입을 알려주는 것이다. 

아래 코드를 보면 BackNumber 를 프로토콜로 작성했고 그 내부에는 backNumber가 int 타입으로 작성되어있다. 이 프로토콜은 get과 set으로 읽기 쓰기 가능한 int 타입의 backNumber를 필요로 한다는 뜻이다.

TottenhamPlayer struct에서 BackNumber를 준수하기로 했고 프로퍼티로 그대로 backNumber를 int 타입으로 작성해 주어야 한다.

protocol BackNumber {
    var backNumber: Int { get set }
}

struct TottenhamPlayer: BackNumber {
    var backNumber: Int
    var playerName: String
}

아래와 같이 backNumber를 작성하지 않으면 에러를 발생시킨다.

struct ArsnalPlayer: BackNumber {
    var playerName: String
}

// error
// Type 'ArsnalPlayer' does not conform to protocol 'BackNumber'

 

프로토콜은 상속이라고 하는 프로세스를 통해 또다른 프로토콜로 상속을 할 수 있다. 클래스와는 다르게 여러 프로토콜을 동시에 상속할 수 가 있다.

protocol BackNumber {
    var backNumber: Int { get set }
}

protocol PlayerName {
    var playerName: String { get set }
}

protocol TrainingSession {
    func pullups()
}

protocol TottenhamPlayerQualifying: BackNumber, PlayerName, TrainingSession { }

 

protocol extension

프로토콜은 어떤 메서드가 필요한지 설명해주지만 내부에 코드를 작성하지는 않는다. extension을 사용하면 메서드 내의 코드를 제공할 수 있지만 하나의 데이터 타입에만 영향을 줄 수 있다. 메서드를 여러 타입에 동시에 추가할 수는 없다.

let tottenhamPlayers = ["sonny", "kane", "winks", "dier", "bd33"]
let arsnalPlayers = Set(["van persie", "vieira", "sol campbell"])

extension Collection {
    func countPlayers() {
        print("토트넘 선수는 \(count) 명 이다.")

        for name in self {
            print(name)
        }
    }
}

print(tottenhamPlayers.count)
print(arsnalPlayers.count)
반응형

'Apple > Swift' 카테고리의 다른 글

Swift 07 - 옵셔널(Optional)  (0) 2022.03.13
Swift 06 - 익스텐션(extension)  (0) 2022.03.12
Swift 04 - 클래스(class)  (0) 2022.03.12
Swift 03 - 구조체(struct)  (0) 2022.03.12
Swift 02 - 클로저(Closure)  (0) 2022.03.12