이전에 함수에서 다뤘지만 한번 더 설명하자면
일급 객체의 조건은 뭐 객체가 런타임에도 생성되어야 하고,
파라미터로 객체를 전달할 수 있고, 반환 값으로 객체를 사용할 수 있고 등등 있는데, 이것을 만족하면 1급 객체이고 → 프로토콜도 이를 만족한다!
→ 변수/상수의 타입이 프로토콜이 될 수 있어야 하고, 함수의 파라미터 타입과 반환 타입으로 프로토콜이 될 수 있어야 한다
⇒ 프로토콜은 독립적인 하나의 타입으로 볼 수 있구나!!!
근데 의문이 드는 점 → 프로토콜로 인스턴스 못 만들자나…? 그럼 변수 타입을 프로토콜로 하면 어케 구현해?
protocol Sopt {
var partLeader: String { get set }
}
struct IOS: Sopt {
var partLeader: String = "김승찬"
var partName: String = "햄볶아요"
}
A. 말이 안됨 따라서 프로토콜 타입을 쓴다는 말은
해당 프로토콜을 채택한 구조체/클래스/열거형의 인스턴스를 프로토콜로 타입 캐스팅을 해서 사용하겠다!
따라서 아래 코드처럼 구현을 해준다면 우리는 partLeader만 접근할 수 있고, partName은 접근할 수 없다! partName은 IOS 구조체의 속성이지 Sopt 프로토콜의 속성이 아니기 때문!
인스턴스를 프로토콜로 타입으로 캐스팅 할 땐 as, as?, as! 모두 가능하지만, 프로토콜로 타입 캐스팅 된 인스턴스를 원래 타입으로 캐스팅 할 땐 런타임에 확인하는 as?나 as!만 가능합니다
위에 내용을 이해했으면 해당 프로토콜을 준수하는 구조체/클래스/열거형 인스턴스를 프로토콜 타입으로 캐스팅해서 전달한다는 것을 알겠죠?
protocol Sopt {
var partLeader: String { get set }
func semina()
}
struct IOS: Sopt {
var partLeader: String = "김승찬"
var partName: String = "햄볶아요"
}
func introduceiOSPart(sopt: Sopt) -> Sopt {
print("우리는 아요파트입니다")
return IOS.init()
}
let ios = IOS.init()
introduceiOSPart(sopt: ios)
프로토콜은 어떤 인스턴스를 생성할 수 있는 객체는 아니기 때문에 Sopt라는 프로토콜을 채택받은 IOS의 인스턴스를 Sopt라는 프로토콜 타입으로 타입 캐스팅해서 리턴한다