STUDY/Swift & iOS

Swift 문법 기초 7

sinawi95 2022. 6. 27. 06:35
728x90

타입 확장

프로토콜

구현해야 할 요구사항을 정의하는 문법

  • 프로토 타입을 제시하는 것이므로 기능을 직접적으로 구현하지 않음
protocol Protocol1 {
	// property
	var var1: Int { get set }
	var var2: String { get }
  //method
	func func1()
	// initializer
	init(var1: Int, var2: String)
}
  • 프로퍼티 요구: 항상 var 키워드 사용
    • get, set을 모두 명시하면 읽기 쓰기 모두 가능한 프로퍼티
    • get은 읽기만 가능해도 상관 없음
  • 메서드 요구
  • 이니셜라이저 요구

채택과 준수

  • 채택(adopted): 구조체, 클래스, 열거형에서 프로토콜을 사용하는 것
  • 준수( conform): 프로토콜을 구현하는 것
struct Class1: Protocol1 {
	var var1: String
  let var2: String // get 만 가능하면되므로 let이든 var든 상관없음
	// 연산 프로퍼티로 대체 가능
	// var topic: String {
	// set { } 
	// get { }
	// }
	// var language: String {return "Korean"} 
	func func1() {
		print("func!!")
	}
	init(var1: Int, var2: String) {
		self.var1 = var1
		self.var2 = var2
	}
}

프로토콜 준수 확인

  • is, as를 사용해서 확인 할수 있음

프로토콜 상속

  • 클래스와 다르게 다중 상속 가능함
  • 클래스에서 프로토콜을 상속받을수 있음.
    • 클래스 상속은 하나만 가능하므로 무조건 맨 앞에 명시해야함
    • 프로토콜은 그 뒤에 나열

익스텐션 Extension

구조체, 클래스, 열거형, 프로토콜 타입에 새로운 기능을 추가할수 있는 기능

구현된 소스코드를 볼수 없거나 알지 못하는 경우 타입만 알고 있으면 타입의 기능을 확장할수 있음

  • 프로퍼티, 메서드, 이니셜라이저, 서브스크립트, 중첩 타입 등
extension TypeName1: Protocol1, ... {
}

예제

extension Int {
	var isEven: Bool {
		return self % 2 == 0
	}
	var isOdd: Bool {
		return self % 2 == 1
	}
}

extension Int {
	func mult(by n: Int) -> Int {
		return self * n
	}
}

extension String {
	init(intTypeNumber: Int) {
		self = "\\(intTypeNumber)"
	}
}

'STUDY > Swift & iOS' 카테고리의 다른 글

[Swift] 38. Responding to User Interactions with IBActions  (0) 2023.01.16
Swift 문법 기초 8  (0) 2022.06.27
Swift 문법 기초 6  (0) 2022.06.25
Swift 문법 기초 5  (0) 2022.06.21
Swift 문법 기초 4  (0) 2022.06.20