TIL
🌱 난 오늘 무엇을 공부했을까?
📌 Protocol Oriented Programming
📍 Protocol in Swift
- Protocol + Extension = Protocol extension
- 특정 타입이 할 일을 지점하고 구현이 가능하다!
📍 Advantage
- 범용적인 사용
- 클래스, 구조체, 열거형 등등
- 제네릭과 결합하면 더욱 파급적인 효과
- 상속의 한계 극복
- 특정 상속 체계에 종속되지 않음
- 프레임워크에 종속적이지 않게 재활용 가능
- 적은 시스템 비용
- Reference tyoe cost > Value tyoe cost
- 용이한 테스트
📍 Summary
- Value Type을 사용하여 성능상의 이득을 취하자
- Protocol + Extension + Generic은 환상의 조합이다
📌 Escaping Closure
- 함수의 매개변수로 받은 클로저를 함수 밖에서도 호출이 가능하도록 사용하는 방법
- 주로 비동기 호출에서 사용한다.
- 기본적으로 함수의 매개변수로 들어오는 클로저는 함수 안에서만 사용할 수 있다.
- 비동기로 클로저를 실행할 때 큐는 클로저를 메모리에 보관하고 나중에 사용
import Foundation
var escapingClosure: (String) -> Void = {_ in }
func excute(text: String, escapingClosuer: @escaping (String) -> Void, nonEscapingClosure: (String) -> Void) {
DispatchQueue.global().async {
escapingClosure(text)
}
}
excute(text: "출력") { String in
print(String)
} nonEscapingClosuer: { String in
print(String)
}
sleep(10)
- Escaping Closure를 사용하는 이유
- 함수내부에서 비동기처리를 하면 호출되는 시점이 언제인지 모르기 때문에
(함수의 호출이 끝나고 클로저가 호출이 될 수 있기 때문에)
탈출 클로저를 사용해서 함수의 호출이 끝나도 클로저의 호출이 가능하도록 하기 위해서 사용하는거 같다.
📌 NameSpace
- enum을 사용하는 NameSpace 에서 중복값과 여러가지 타입의 값을 case와 중첩타입으로 처리하는 방법
- static let과 case의 단점을 모두 커버하는 방법으로 유지보수에 좋을것 같다.
enum NameSpace {
case magicLiteral1
case magicLiteral2
var duplicatevalues: String {
switch self {
case .magicLiteral1:
return "1"
case .magicLiteral2:
return "1"
}
}
var number: Int {
switch self {
case .magicLiteral1:
return 1
case .magicLiteral2:
return 1
}
}
}