Search
Duplicate
🧸

Swift) 타입Protocol 과 이를 이용한 Singleton 의존성 개선

간단소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
Swift
Scrap
태그
9 more properties

프로토콜은 타입으로 사용이 가능하다.

이것은 해당 프로토콜을 채택한 어떠한 클래스의 인스턴스도 들어갈 수 있다는 것을 의미한다.
" You can set it to an instance of any type that adopts the protocol ."
예를 들어
protocol Human { func getAge() -> Int } class Male: Human { var age: Int init(_ age: Int) { self.age = age } func getAge() -> Int { return age } } class Female: Human { var age: Int var name: String init(age: Int, name: String) { self.age = age self.name = name } func getAge() -> Int { return age } } var someOne: Human let jinyong = Male(28) let jung = Female(age: 32, name: "female") someOne = jinyong someOne.getAge() someOne = jung someOne.getAge()
Swift
복사

연산프로퍼티를 포함하고 있는 프로토콜

연산프로퍼티를 통해서 채택하고 있는
클래스 내부의 값을 정할수 있고 {get}
혹은 클래스 내부의 값을 변경할수 있다 { set }
protocol Human { func getAge() -> Int var Name: String { get } } class Male: Human { var Name: String { return self.name } var age: Int var name: String init(age: Int, name: String) { self.age = age self.name = name } func getAge() -> Int { return age } } var someOne: Human let jinyong = Male(age: 28, name: "jinyong") someOne = jinyong someOne.Name
Swift
복사

이거는 언제 쓰나요???

이러한 방법을 통해서 프로토콜 그 자체를 타입으로 사용하여, 싱글톤 객체에 대한 디팬던시를 줄일수 있다.
즉, 프로토콜을 채택한 클래스만, 싱글톤 객체에 접근할수 있도록 해주며, 또한 해당 객체가 싱글톤 객체라는것을 해당 클래스에게 알려주지 않는것을 통해 싱글톤의 문제점인 여러 클래스에서 인스턴스에 접근하게 되는 문제점을 해결할수 있는 좋은 방법인 것이다.

프로토콜 채택 여부 확인( is, as, as?, as!)

프로토콜을 채용하고 있는지 확인하는데에는 타입캐스팅 연산자를 사용한다. ( is, as, as?, as! )
is : 프로토콜 채택여부를 bool값으로 반환
as: 프로토콜 타입으로 캐스팅 시도
as? : as에서 → 성공시 옵셔널<프로토콜> 타입, 실패시 nil
as!: as에서 옵셔널<프로토콜>타입을 <프로토콜 >타입으로 강제 언래핑
참고자료