728x90
안녕하세요.
이번에는 Flow라는 오픈소스를 직접 써보는 시간을 가져볼게요.
This library provides a bunch of extension methods for a better fluent syntax in Swift. This style is very useful for some operations that benefit from being able to be chained (composed) together.
Flow 라이브러리는 Swift의 가독성을 높이는 확장 method를 제공합니다.
살펴볼게요ㅎㅎ
## 1. then
then method는 copy한 인스턴스를 리턴하기 때문에, 주로 인스턴스를 초기화할 때 사용합니다.
초기 설정들을 블록 안에서 처리하기 때문에, 초기화를 어떻게 했는지 더 명확하게 보여서 가독성이 좋아집니다.
let label = UILabel().then {
$0.text = "Hello"
$0.textColor = .red
$0.translatesAutoresizingMaskIntoConstraints = false
}
## 2. mutate
mutate method는 위에서 소개한 then과 유사한 기능이지만 리턴값이 없는게 특징입니다.
인스턴스의 속성을 바꿀 수 있기 때문에, let이 아닌 var로 선언되어야 합니다.
let label = UILabel().then { // 리턴값이 있음. let으로 선언해도 됨.
$0.text = "Hello"
$0.textColor = .red
$0.translatesAutoresizingMaskIntoConstraints = false
}
var label2 = UILabel()
label2.mutate { // 리턴값이 없음. var로 선언해야 함.
$0.text = "world"
}
## 3. let
map(고차함수)과 유사하게 전달받은 인스턴스를 다른 타입으로 변환시킬 수 있습니다.
let dateString: String = Date().let { // Date -> String으로 변환
let formatter = DateFormatter()
formatter.format = "yyyy"
return formatter.string(from: $0)
}
// dateString = "2022"
map과 다른 점이 있다면, collection에서 map을 사용하면 element 하나하나가 적용되지만, let method는 collection 자체에 적용이 됩니다.
var strArr = ["1", "2", "3"]
var mapVar = strArr.map { String in // element에 적용
// code
}
var letVar = strArr.let { [String] in // collection 자체에 적용
// code
}
## 4. debug
디버그 로그를 출력합니다.
let result = Object()
.then { ... }
.debug("prefix")
.let { ... }
.debug()
## 5. run
클로저 블록 자체를 실행해야 할 때, run method를 사용해서 코드를 더 명확하게 표현할 수 있습니다.
let result1 = {
label.text = "new Value"
}()
let result2 = run { // result1, result2의 동작은 동일하나, run 키워드를 사용해서 코드 가독성이 조금은 좋아졌을지도?
label.text = "new Value"
}
이번 글은 여기서 마무리.
반응형
'Swift' 카테고리의 다른 글
FormatStyle (0) | 2022.03.24 |
---|---|
PersonNameComponents를 사용해서 이름 파싱하기 (0) | 2022.03.23 |
precondition(_:_:file:line:) (0) | 2022.03.16 |
[Swift 5.6] Swift 5.6 추가된 기능들 (1) | 2022.03.12 |
CryptoKit을 사용한 암호화 (0) | 2022.02.23 |