스위프트 공식문서를 참조하였습니다.
익스텐션(extension)
정의
익스텐션이란 스위프트에서 클래스, 구조체, 열거형, protocol에 새로운 기능을 추가 할때, 사용하는 방법이다.
- 상속하지 않고, 기존 클래스의 메소드나 다양한 기능을 추가 하기 위한 방법이다. 즉 이름 그대로 확장의 개념이다.
- 내장된 클래스나 라이브러라, 프레임워크에 다양한 기능을 추가하기 위해서 사용함
선언
extension 기존타입이름 { // 새로운 기능 , 추가될 기능 }
예시
import UIKit extension Double{ var DDouble : Double{ return self*self } } let myValue : Double = 3.08 print(myValue) print(myValue.DDouble)
computed property를 사용해서 DDouble이라는 double 구조체에 맴버를 추가하고 print해봤다.
프로토콜 extension을 통한 default값 설정
extension의 경우에는 단순하게, 프로토콜, 클래스, enum, 구조체 등에 존재하는 함수를 변경하기 위해서 사용하기도 하지만, 프로토콜에서 조금 특별하게 쓰이기도 한다.
프로토콜의 경우에는 함수의 선언만 되어있고 정의가 전혀 되어있지 않는다. 따라서 클래스나, 구조체에서 해당 함수를 사용할때 계속해서 정의해서 사용해야 하는데, 이러한 정의를 default값을 정하는 방법을 통해서 해결할수 있다. 그 방법이 바로 extension이다.
protocol Makefun{ func plus(Int)->Int } class Man : Makefun { func plus(_ number : Int)->Int{ return number + 2 } }
위의 케이스가 함수를 정의를 해서 사용해야 하는 방법이지만, 이처럼 func plus를 사용하기 위해서는 계속해서 저런 방식으로 정의를 해주어야 한다. 하지만 여기에서 extension을 사용하게 되면
protocol MakeFun{ func plus(number: Int)->Int } extension MakeFun{ func plus(number: Int)-> Int{ return number + number } } class Man : MakeFun { var numbers = 2 } let man = Man() man.plus(number: 3)
이런식으로 사용할수 있다.
또한 클래스나 구조체 열거형 내 함수를 extension을 할경우에는 해당 클래스의 extension을 해야한다.
delegate 디자인 패턴에서 extension을 이용한 코드정리
import UIKit class WeatherViewController: UIViewController{ var weatherManager = WeatherManager() @IBOutlet weak var conditionImageView: UIImageView! @IBOutlet weak var temperatureLabel: UILabel! @IBOutlet weak var cityLabel: UILabel! @IBOutlet var searchTextField: UITextField! override func viewDidLoad() { super.viewDidLoad() searchTextField.delegate = self weatherManager.delegate = self } } //MARK: UITextFieldDelegate extension WeatherViewController : UITextFieldDelegate{ @IBAction func searchPressed(_ sender: UIButton) { print(searchTextField.text!) searchTextField.endEditing(true) } func textFieldShouldEndEditing(_ textField: UITextField) -> Bool { if searchTextField.text != ""{ return true }else { searchTextField.placeholder = "Type any city" return false } } func textFieldShouldReturn(_ textField: UITextField) -> Bool { if searchTextField.text != ""{ print(searchTextField.text!) }else{ searchTextField.placeholder = "type the city " } return true } func textFieldDidEndEditing(_ textField: UITextField) { if let city = searchTextField.text{ weatherManager.fetchUrl(cityName: city) } searchTextField.text = "" } } //MARK: - WeatherManagerDelegate extension WeatherViewController: WeatherManagerDelegate{ func didUpdateWeather(_ weatherManager: WeatherManager, weather: WeatherModel){ print(weather.temp) DispatchQueue.main.async { self.temperatureLabel.text = weather.tempString self.conditionImageView.image = UIImage(systemName: weather.conditionName) } } func didFailWithError(error: Error) { print(error) } }
원래 같은경우에는 위의 함수를 전부 viewController에 작성해둬야 하지만 extension을 이용해서 따로 코드를 정리하는 것으로 한눈에 delegate 프로토콜에 어떠한 함수가 들어가있는지 정리할수 있다.
Uploaded by
N2T