Protocol
작성일
Protocol
- 규격, 규약, 규칙, 뼈대
protocol이란 다른곳에서 사용할 때 무조건 있어야하는 것들을 모아놓은 것이다.
protocol UserInfo {
var name: String { get set }
var age: Ing { get set }
func isAdult() -> Bool
}
get은 무조건 있어야한다. set은 필요여부에 따라 만들수도있고, 지울수도 있다.
구현부는 절대로 들어가면 안된다.
사용 예제를 보면,
protocol UserInfo {
var name: String { get set }
var age: Ing { get set }
func isAdult() -> Bool
}
class Guest: UserInfo {
var name: String == ""
var age: Ing = 0
func isAdult() -> Bool {
if age > 19 {
return true
}
return false
}
}
class Member: UserInfo {
var name: String == ""
var age: Ing = 0
func isAdult() -> Bool {
if age > 19 {
return true
}
return false
}
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
이런 식으로 사용할 수 있다.
extension으로 확장된 기능을 사용할 수 있는데,
protocol UserInfo {
var name: String { get set }
var age: Ing { get set }
func isAdult() -> Bool
}
//추가된 부분
extension UserInfo {
func isAdult() -> Bool {
if age > 19 {
return true
}
return false
}
}
class Guest: UserInfo {
var name: String == ""
var age: Ing = 0
}
이렇게 추가를 시키면 밑에 부분에 isAult메서드를 사용하지 않아도 자동으로 추가가 된다.
protocol에 좋은 점은 하나 더있다 예를들어보면,
protocol UserInfo {
var name: String { get set }
var age: Ing { get set }
func isAdult() -> Bool
}
extension UserInfo {
func isAdult() -> Bool {
if age > 19 {
return true
}
return false
}
}
class Guest: UserInfo {
var name: String == "kim"
var age: Ing = 0
}
class UserInfoPresenter {
func present() {
let guest = Geust()
let member = Member(name: "jane", age: 25)
print(guest.name)
print(member.name)
}
}
let presenter = UserInfoPresenter()
presenter.present()
이렇게 코드가 있으면, 하나하나 적어서 내놓아야한다 하지만, protocol에 정의를 해놨으니,
class UserInfoPresenter {
func present() {
let guest = Geust()
let member = Member(name: "jane", age: 25)
print(guest.name)
print(member.name)
}
}
이부분을
class UserInfoPresenter {
func present() {
let guest = Geust()
let member = Member(name: "jane", age: 25)
//추가된 부분
let members: [UserInfo] = [guest, member]
for element in members {
print(element.name)
}
}
}
이렇게 바꿔줘도 위 코드와 같은 결과 값이 나온다.
프로토콜을 이런방식으로도 사용할 수 있다.