[swift] 21~24. 프로토콜

RudinP·2023년 9월 22일
0

Study

목록 보기
42/227
  • 인터페이스같은 느낌..?
  • 어떤 걸 사용, 정의해야하는지 사전에 설정하는 것

프로토콜 명명 규칙

  • delegate 라면 __delegate
  • __able
  • __ing

프로토콜 정의

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

프로토콜 임플리먼트

  • 상속같은 느낌으로 써주면 된다.
  • 프로토콜에서 정의해둔 멤버들을 전부 정의하지 않으면 에러 발생
struct Friend: Naming{
	var name: String
    func getName() -> String{
    	return self.name
    }
}

프로토콜 상속

  • 프로토콜을 상속할 수 있다.
  • 프로토콜을 다중상속 할 수 있다.
protocol Naming{
	var name: String {get set}
    func getName() -> String
}
protocol Aging{
	var age: Int {get set}
}
protocol UserNotifialbe: Naming, Aging{

}

struct User: UserNotifiable{
	//Naming,Aging의 멤버들 전부 정의해야 함
}

프로토콜 확장

  • 프로토콜 정의부에서의 함수는 바디를 가질 수 없다.(로직설정 불가)
protocol Naming{
	var firstName: String {get set}
    var lasName: String {get set}
    
    func getName() -> String{}//컴파일 에러
}
  • extension 키워드를 통해 프로토콜을 확장하여 미리 함수를 정의할 수 있다.
protocol Naming{
	var firstName: String {get set}
    var lastName: String {get set}
    
    func getName() -> String
}
extension Naming{
	func getFullName() -> String{
    	return lastName + " " + firstName
    }
}
  • 만약 extension에서 정의된 함수와 protocol에서 정의된 함수가 같은 함수라면 프로토콜을 사용하는 곳에서 따로 다시 함수를 정의해주지 않더라도 사용 가능하다.
protocol Naming{
	var firstName: String {get set}
    var lastName: String {get set}
    
    func getFullName() -> String
}
extension Naming{
	func getFullName() -> String{
    	return lastName + " " + firstName
    }
}

struct User{
	var firstName: String {get set}
    var lastName: String {get set}
    //getFullName 정의 안함
}

let userA = User(firstName: "A", lastName: "B")
userA.getFullName() //"B A"

프로토콜 associatedType

  • 프로토콜에서 제네릭타입을 가질 수 있게 해주는 형식
protocol PetHaving{
	associatedType T
    var pets: [T] {get set}
    mutating func gotNewPet(newPet: T)
}

extension PetHaving{
	mutating func gotNewPet(newPet: T){
    	self.pets.append(newPet)
    }
}

enum Animal{
	case cat, dog, bear
}

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

struct Family: PetHaving{
	var pets = [String]()
}

var myFriends = Friend()
myFriends.gotNewPet(newPet: Animal.bear)
myFriends.pets //[bear]

var myFamily = Family()
myFamily.gotNewPet(newPet: "Bear")
myFamily.pets //["Bear"]
profile
곰을 좋아합니다. <a href = "https://github.com/RudinP">github</a>

0개의 댓글