열거형, 클래스, 구조체 등의 객체를 확장하여 새로운 기능을 추가할 수 있습니다.
기존에 존재하는 기능을 추가하는것은 클래스의 상속을 통해서도 충분히 가능한데 우리는 왜 Extension
을 사용할까요?
즉, 클래스의 상속과 달리 타입에 상관없이 그리고 타입을 구현한 소스코드를 몰라도 간단하게 타입의 기능을 확장할 수 있습니다!
익스텐션을 이용하면 굉장히 편리하게 우리가 원하는 기능을 추가할 수 있음을 알 수 있습니다.
추가적으로 익스텐션의 성질에 대해 알아보고 간단한 예제를 살펴 보겠습니다.
Extension
은 클래스, 구조체 처럼 객체로 존재하는 것이 아니라, 다른 객체를 확장해주는 역할만 담당합니다.Extension
은 타입에 새로운 기능을 추가 할 수는 있지만, 기존에 존재하는 기능을 재정의할 수 없습니다. (상속과 차이점)
Extension
에 연산 프로퍼티, 메서드, 이니셜라이저 등을 추가할 수 있습니다. (❗️ 저장 프로퍼티는 추가할 수 없습니다.)
간단한 예제를 살펴 보겠습니다.
import Foundation
import UIKit
extension UIViewController {
//ViewController 에서 바로 사용할 수 있음!!
func setBackgroundColor() {
view.backgroundColor = .red
}
func justforTest() -> (Void) {
print("Hello This is Extension Test!")
}
var testForExtension: Int {
get {
return 10
}
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
justforTest() // Hello This is Extension Test!
print(testForExtension)// 10
}
}
위와 같이 익스텐션을 통해서 UIViewController
클래스에 메서드와 연산 프로퍼티를 추가하면
해당 클래스를 상속받는 다른 클래스에서도 우리가 추가한 기능들을 사용할 수 있는것을 확인 할 수 있습니다.
생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. 이와 같은 디자인 유형을 싱글턴 패턴이라고 한다.
-위키피디아
용도에 따라 객체를 하나만 생성해서 공용으로 사용한다.
간단한 예제를 생각해보겠습니다.
class DeliveryInfo {
static let shared = DeliveryInfo()
var menu: String?
var additionalMenu: String?
var address: String?
}
만약, View A -> B -> C
순으로 메뉴를 정하고, 추가 메뉴를 설정하고, 주소를 입력하는 앱이 있다고 해보겠습니다.
이때, A, B, C Viewcontroller
에서 각각 DeliveryInfo
의 인스턴스를 생성하게 되면 각 인스턴스에 하나의 정보만 저장되게 됩니다.
하나의 인스턴스를 통해서 저장할 수 있는데 3 개의 인스턴스를 사용하게 되기 때문에 메모리적인 측면에서 손해입니다.
그럼, 하나의 전역적인 인스턴스를 만들어서 A -> B -> C
를 돌면서 각각의 정보를 저장하면 어떨까요?
이런 디자인을 singleton pattern
이라고 합니다.
해당 블로그를 참고했습니다!
UITableView Automatic Dimension
을 적용해보려고 하는데 셀의 높이가 늘어나지 않는다...
레이아웃 설정을 잘못 잡은건지 놓친게 있는지 천천히 확인해봐야 할것 같습니다. ㅠ