Then라이브러리 소개
안녕하세요. 이번엔 전수열 개발자님이 만드신 Then 라이브러리를 소개하려고 합니다.
저 같은 경우 아주 애용하는 오픈소스인데요. 간단하면서도 강력한 기능을 제공해 줍니다.
깃허브 주소: https://github.com/devxoul/Then
Then
Swift initializers를 위한 라이브러리로 클로저를 이용한 인스턴스 초기화를 좀 더 깔끔하게 사용할 수 있도록 도와줍니다.
사용 예제
일단 사용 예제부터 보여드리겠습니다.
일반적으로 UI 인스턴스를 생성하고 속성을 적용할 때
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
let label = UILabel()
func setupLayout() {
label.text = "label"
label.textColor = .blue
label.font = UIFont.systemFont(ofSize: 12, weight: .regular)
}
// or
let label: UILabel {
let label = UILabel()
label.text = "label"
label.textColor = .blue
label.font = UIFont.systemFont(ofSize: 12, weight: .regular)
return label
}
이런 식으로 UI 인스턴스 생성 후 속성을 설정하거나 클로저 방식으로 인스턴스 생성과 속성을 정해줍니다.
같은 기능을 Then을 사용해 구현해 보겠습니다.
1
2
3
4
5
let label = UILabel().then {
$0.text = "label"
$0.textColor = .blue
$0.font = UIFont.systemFont(ofSize: 12, weight: .regular)
}
이렇게 기존 코드보다 간결하고 가독성 있게 코드를 짤 수 있습니다.
분석
Then 라이브러리가 구현된 곳을 살펴보시면 then 말고도 with, `do` 함수도 있는데요.
우선 Then의 경우 프로토콜로 구현이 되어 있습니다.
1
2
3
4
5
6
7
8
9
public protocol Then {}
extension Then where Self: Any {
// with Method
// `do` Method
}
extension Then where Self: AnyObject {
// then Method
}
then의 경우 AnyObject, with, `do`의 경우 Any에 확장 시켜서 다양한 타입에 사용이 가능합니다.
- Any: 함수타입을 포함하여 모든 타입의 인스턴스
- AnyObject: 모든 클래스 타입의 인스턴스
1
2
3
4
5
6
7
8
9
extension NSObject: Then {}
extension Array: Then {}
extension Dictionary: Then {}
extension Set: Then {}
extension UIEdgeInsets: Then {}
extension UIOffset: Then {}
extension UIRectEdge: Then {}
또 이럲게 여러 타입에 채택시켜 Then을 사용할 수 있게 되어 있습니다. 위와 같은 방법으로 custom 타입을 확장해 Then을 사용할 수 있는데요
1
2
3
4
5
extension CustomType: Then {}
let instance = CustomType().then {
$0.속성 = 내용
}
이렇게도 사용이 가능합니다.
마무리
with의 경우 값 유형을 초기화하고 복사한 직후 클로저로 속성을 설정할 수 있고, do는 무언가 실행할 때 사용한다고 나와 있는데 일하면서 then만 쓰고 써본 적은 없는 거 같습니다…
그래도 then 기능만으로도 아주 간결하게 코드를 짤 수 있으므로 매우 추천해 드리는 라이브러리입니다.
pod를 이용해 설치하시거나 아니면 직접 구현해서 사용하셔도 되지 않을까 합니다.
댓글남기기