티스토리 뷰
프레임워크
- 시스템 레벨에서 제공, 앱의 전체적인 흐름을 담당하며 개발자는 규칙을 지키며 사용한다
라이브러리
- 직접 추가해서 사용, 특정 기능을 제공하며 개발자는 필요에 의해 사용한다
스냅킷
- UIKit에서 오토 레이아웃을 편하게 적용 가능하게 해주는 라이브러리
- https://github.com/SnapKit/SnapKit
스냅킷을 사용하지 않은 기존의 오토레이아웃
poster.translateAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
poster.leadingAnchor.constraint(equalTo: self.leadingAnchor),
poster.trailingAnchor.constraint(equalTo: self.trailingAnchor),
poster.topAnchor.constraint(equalTo: self.topAnchor),
poster.bottomAnchor.constraint(equalTo: title.topAnchor)
])
스냅킷을 사용한 오토레이아웃
poster.snp.makeConstraints { // 영화 포스터
$0.leading.trailing.top.equalToSuperview()
$0.bottom.equalTo(title.snp.top)
}
// 특정 값을 넣고 싶을땐 상수 값을 넣어도 된다
$0.height.equalTo(40)
// 특정 여백을 주고 싶을땐 offset, inset, magin 등을 활용할 수 있음
$0.bottom.equalTo(title.snp.top).offset(20) // title의 top으로 부터 20만큼 띄움
// SafeArea를 고려한다면 아래와 같음
poster.snp.makeConstraints { // 영화 포스터
$0.top.equalTo(self.safeAreaLayoutGuide.snp.top)
$0.leading.trailing.equalToSuperview()
$0.bottom.equalTo(title.snp.top)
}
Then
- Super sweet syntactic sugar for Swift initializers 라고 소개되는 이니셜라이저를 위한 라이브러리
- https://github.com/devxoul/Then
깃허브에서 소개되는 대표적인 예시 UILabel로 해당 내용만 보더라도 이해가 가능하다 Then을 사용하지 않은 기존의 코드
let label: UILabel = {
let label = UILabel()
label.textAlignment = .center
label.textColor = .black
label.text = "Hello, World!"
return label
}()
Then에서 제공하는 기능
각 예시는 Then의 Then.swift 파일에서 발췌함
then
- block를 자기 자신에게 적용한뒤 자신을 반환한다
@inlinable
public func then(_ block: (Self) throws -> Void) rethrows -> Self {
try block(self)
return self
}
let label = UILabel().then {
$0.textAlignment = .center
$0.textColor = UIColor.black
$0.text = "Hello, World!"
}
with
- 자기 자신을 copy에 복사하고 block을 복사한 copy에 적용한 뒤 반환한다
- self를 복사해서 진행하기 때문에 with는 값 타입에서 사용 하는 것 같다 (레퍼 타입인 class도 사용은 가능하지만 then을 두고 굳이 with를 쓰진 않을듯 하다, 값 타입은 then을 쓸 수 없음)
@inlinable
public func with(_ block: (inout Self) throws -> Void) rethrows -> Self {
var copy = self
try block(©)
return copy
}
let frame = CGRect().with {
$0.origin.x = 10
$0.size.width = 100
}
do
- block을 적용한뒤 자신을 반환하지 않는다
- 반환 값이 존재하지 않기 때문에 do는 말그대로 실행을 위해 제공된다.
@inlinable
public func `do`(_ block: (Self) throws -> Void) rethrows {
try block(self)
}
UserDefaults.standard.do {
$0.set("devxoul", forKey: "username")
$0.set("devxoul@gmail.com", forKey: "email")
$0.synchronize()
}
'프로그래밍 > iOS' 카테고리의 다른 글
| [Combine-2] Combine? Publisher? Subscriber? Operator? (0) | 2025.03.06 |
|---|---|
| [Combine-1] 동기(Sync), 비동기(Async) (0) | 2025.03.05 |
| 뷰컨트롤러 생명주기 (1) | 2024.07.18 |
