Search

[라이브러리 정리] 라이브러리 쪼개보기 - Then

이번주는 제가 굉장히 애정하고 자주 사용하는 Then를 열심히 파보려고 했으나,
??????????
고작 파일은 하나지만 제가 사용하면서 알고 싶은 점이 많았기에 그냥 하나를 열심히 파보는걸로 마음을 굳힙니다. 파일을 위에서부터 아래까지 싹싹 긁어서 먹겠습니다.

훑어보기

저번주 라이브러리에서 빈번하게 나왔던 전처리기가 여기에도 있네요.
import Foundation #if !os(Linux) import CoreGraphics #endif #if os(iOS) || os(tvOS) import UIKit.UIGeometry #endif
Swift
복사
저희는 해당 코드로 Then은 Linux, iOS, tvOS 세가지에서만 제공되는 걸 알 수 있습니다.
위에 import를 따로 하는 부분은 가장 마지막에 있는 부분을 위해서 그렇게 한 것 같습니다.
extension NSObject: Then {} #if !os(Linux) extension CGPoint: Then {} extension CGRect: Then {} extension CGSize: Then {} extension CGVector: Then {} #endif extension Array: Then {} extension Dictionary: Then {} extension Set: Then {} #if os(iOS) || os(tvOS) extension UIEdgeInsets: Then {} extension UIOffset: Then {} extension UIRectEdge: Then {} #endif
Swift
복사
다들 Then를 상속 받았네요.
그렇다면 Then은 무엇인가?
public protocol Then {}
Swift
복사
태생이 protocol입니다. 이제 이 안에다가 extension를 사용해서 코드를 넣어줄 겁니다.
extension Then where Self: Any { @inlinable public func with(_ block: (inout Self) throws -> Void) rethrows -> Self { var copy = self try block(&copy) return copy } @inlinable public func `do`(_ block: (Self) throws -> Void) rethrows { try block(self) } }
Swift
복사
where를 통해서 Any타입에만 적용될 수 있도록 제약을 줬습니다.
그리고 밑으로 내려오면 보이는 @inlinable
@inlinable이 뭔가요?
with
아마 with라는 Then에서 제공해주는 기능을 모르는 분들도 있을겁니다.
let newFrame = oldFrame.with { $0.size.width = 200 $0.size.height = 100 } newFrame.width // 200 newFrame.height // 100
Swift
복사
이런 식으로 사용하는 함수로 value type를 copy할 때 사용하시면 됩니다.
do
적은 타이핑으로 무언가를 하고 싶으시다면 do를 사용하시면 됩니다.
UserDefaults.standard.do { $0.set("devxoul", forKey: "username") $0.set("devxoul@gmail.com", forKey: "email") $0.synchronize() }
Swift
복사
이렇게 UserDefaults를 set하는 코드를 짤 수 있습니다.
extension Then where Self: AnyObject { @inlinable public func then(_ block: (Self) throws -> Void) rethrows -> Self { try block(self) return self } }
Swift
복사
위와는 다르게 AnyObject에만 적용될 수 있도록 제약을 줬습니다.
이 안에는 저희가 잘 아는 then이 있구요.
알던대로 잘 사용하시면 되겠습니다.
let titleLabel = UILabel().then { $0.textColor = .black $0.textAlignment = .center }
Swift
복사
그리고 놀랍게도 이게 Then.swift의 끝입니다.
이번 라이브러리 내용이 너무 적어서 저번주 라이브러리에 대한 내용들을 꽉 채워두었으니 확인부탁드리겠습니다.