-
Swift4: Protocol Oriented Programming - 3.확장POP 2021. 2. 15. 01:18
3장 확장
확장
확장은 이미 존재하는 타입의 소스 코드가 없더라도 기능을 추가할 수 있게 해준다.
확장으로 추가할 수 있는 것들
- 연산 프로퍼티
- 인스턴스/타입 메소드
- Convenience Initializer
- 서브스크립트
저장 프로퍼티는 추가할 수 없음!
extension String { func getFirstChar() -> Character? { guard count > 0 else { return nil } return self[startIndex] } subscript(r: CountableClosedRange<Int>) -> String { get { let start = index(self.startIndex, offsetBy: r.lowerBound) let end = index(self.startIndex, offsetBy: r.upperBound) return String(self[start..<end]) } } }
프로토콜 확장
프로토콜을 확장할 때에는 해당 프로토콜을 따르는 모든 타입에서 예상대로 동작하는 것을 보장해야한다.
extension Collection { func evenElements() -> [Iterator.Element] { var index = startIndex var result: [Iterator.Element] = [] var i = 0 repeat { if i % 2 == 0 { result.append(self[index]) } index = self.index(after: index) i += 1 } while index != endIndex return result } } var origDict = [1: "One", 2: "Two", 3: "Three", 4: "Four"] var returnElements = origDict.evenElements() // dictionary는 순서가 없기 때문에 원하는대로 동작하지 않음
위 상황처럼 dictionary는 collection 프로토콜을 채택하고 있지만 evenElements() 함수가 기대한대로 동작하지는 않는다. 이런 경우에서는 Collection이 아니라 Array를 확장하는 것이 나았을 것.
확장하는 프로토콜 이름 뒤에
where
키워드로 제약을 추가할 수도 있다.extension Collection where Self: ExpressibleByArrayLiteral {} extension Collection where Iterator.Element: Comparable {}
그러나 제약을 주는 것보다는 실제 확장하고자 하는 개별 타입에 확장을 사용하는 것이 좋다.
Equatable
Equatable 프로토콜을 따르는 타입은 항등 연산자
==
로 동등 비교, 동등하지 않음을 비교하는 비항등 연산자!=
를 사용할 수 있다.extension Place: Equatable { static func == (lhs: Place, rhs: Place) -> Bool { return lhs.id == rhs.id && lhs.latitude == rhs.latitude && lhs.longitude == rhs.longitude } }
참고 문헌https://book.naver.com/bookdb/book_detail.nhn?bid=14107671
'POP' 카테고리의 다른 글
Swift4: Protocol Oriented Programming - 6.프로토콜지향 프로그래밍 (0) 2021.02.17 Swift4: Protocol Oriented Programming - 5.객체지향 프로그래밍 (0) 2021.02.16 Swift4: Protocol Oriented Programming - 4.제네릭 (0) 2021.02.15 Swift4: Protocol Oriented Programming - 2.타입 선택 (0) 2021.02.14 Swift4: Protocol Oriented Programming - 1.프로토콜 시작 (0) 2021.02.12