[문법] 프로토콜

2023. 8. 15. 11:26Swift

320x100
프로토콜
적합한 유형이 구현해야 하는 요구사항을 정의합니다.

프로토콜은 특정 작업이나 기능에 적합한 방법, 속성 및 기타 요구 사항의 청사진을 정의합니다. 프로토콜은 그런 다음 class, struct 또는 enum에 의해 채택되어 이러한 요구 사항의 실제 구현을 제공할 수 있습니다. 프로토콜의 요구 사항을 충족하는 모든 유형은 해당 프로토콜에 부합한다고 합니다.

적합한 유형이 구현해야 하는 요구 사항을 지정하는 것 외에도 프로토콜을 확장하여 이러한 요구 사항 중 일부를 구현하거나 적합한 유형이 활용할 수 있는 추가 기능을 구현할 수 있습니다.

출처 : https://docs.swift.org/swift-book/documentation/the-swift-programming-language/protocols/

프로토콜

프로토콜의 이름은 주로 **delegate, **able, **ing로 정의할 수 있다.

//프로토콜로 약속
protocol Naming{
    //우리는 이런 변수를 가지고 있을겁니다 라고 약속
    var name: String {get set}
    //우리는 이런 메소드를 가지고 있을겁니다 라고 약속
    func getName() -> String
}

protocol Aging{
    var age: Int {get set}
}

프로토콜을 정의한 후, 사용할 때, 프로토콜의 변수와 메소드들을 사용자 입맛에 맞게 정의

struct Friend : Naming {
    var name: String
    func getName() -> String{
        return "내 친구: " + self.name
    }
}

let myFriend = Friend(name: "철수")
print(myFriend.getName())
// 내친구 철수

프로토콜 상속

여러 개의 프로토콜을 상속받을 수 있다.

protocol UserNotifiable: Naming, Aging{
}

상속받은 프로토콜을 사용하게 되면, 상속받은 모든 변수, 함수를 정의해주어야 한다.

struct MyFriendNotification : UserNotifiable {
    var name: String
    var age: Int
    func getName() -> String{
        //코드 작성
    }
}

프로토콜 확장

기본적으로 프로토콜을 정의할 때 로직을 넣을 수 없음.

protocol Naming {
    var lastname: String {get set}
    var firstname: String {get set}
    func getName() -> String
}

extension을 활용하여 확장하게 된다면 로직을 넣을 수 있다.

extension Naming {
    func getFullname(){
        return self.lastname + " " + self.firstname
    }
}
struct Friend : Naming {
    var lastname: String
    var firstname: String
    func getName() -> String{
        return self.lastname
    }
}

let myFriend = Friend(lastname: "쩡", firstname: "대리")

myFriend.getName()		//쩡
myFriend.getFullName()		//쩡 대리

associatedType

generic 형태로 받아올 수 있는 타입

protocol PetHaving{
    associatedtype T
    var pets: [T] {get set}
    mutating func gotNewPet(_ newPet: T)
}

extension PetHaving{
    mutationg func getNewPet(_newPet: T){
        self.pets.append(newPet)
    }
}

associatedType을 사용하여 원하는 자료형을 넣을 수 있다.

enum Animal {
    case cat, dog, bird
}

struct Friend: PetHaving{
    var pets: [Animal] = []
}

struct Family : PetHaving {
    var pets: [String] = []
}
var myFriend = Friend()	//mutating이 들어갔으므로 let이 아닌 var을 사용해야 함

myFriend.gotNewPet(Animal.bird)
myFriend.gotNewPet(Animal.cat)
myFriend.gotNewPet(Animal.dog)
print(myFriend.pets)	//[bird, cat, dog]

var myFamily = Family()
myFamily.gotNewPet("거북이")
myFamily.gotNewPet("토끼")
myFamily.gotNewPet("강아지")
print(myFamily.pets)	//["거북이", "토끼", "강아지"]
출처: 개발하는 정대리 swift 문법 인프런 강의
728x90

'Swift' 카테고리의 다른 글

NotificationCenter  (2) 2023.10.24
[문법] Codable  (0) 2023.08.18
[문법] Error  (0) 2023.08.14
[문법] inout  (0) 2023.08.14
[문법] Closure  (0) 2023.08.04