티스토리 뷰

프로그래밍/iOS

SnapKit, Then 알아보자

시르베어 2025. 3. 4. 14:14

프레임워크

  • 시스템 레벨에서 제공, 앱의 전체적인 흐름을 담당하며 개발자는 규칙을 지키며 사용한다

라이브러리

  • 직접 추가해서 사용, 특정 기능을 제공하며 개발자는 필요에 의해 사용한다

스냅킷

스냅킷을 사용하지 않은 기존의 오토레이아웃

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

깃허브에서 소개되는 대표적인 예시 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(&copy)
  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()
}

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함