let dynamicColor = UIColor { (traitCollection: UITraitCollection) -> UIColor in

	if traitCollection.userInterfaceStyle == .dark 	{
		return .black
	} else {
		return .white
	}
}

class BackgroundView: UIView {
	override func draw(_ rect: CGRect) {
		// 현재 그래픽 컨텍스트에 채울 색을 선택한다.
		UIColor.systemBackground.setFill()
		// 현재 선택한 색으로, rect를 채운다.
		UIRectFill(rect)
	}
}

let layer = CALayer()
let traitCollection = view.traitCollection

// 첫번째 옵션
let resolvedColor = UIColor.label.resolvedColor(with: traitCollection)
layer.borderColor = resolvedColor.cgColor

// 두번째 옵션
traitCollection.performAsCurrent {
	layer.borderColor = UIColor.label.cgColor
}

// 세번쩨 옵션
// 스레드 안전하고, 해당 스레드에서만 영향을 미친다.
// 그래도 이후 로직의 사이드 이펙트를 없애기 위해서, 원래 값을 저장해 놓고 쓰는 게 좋다.
UITraitCollection.current = traitCollection
layer.borderColor = UIColor.label.cgColor

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {

	super.traitCollectionDidChange(previousTraitCollection)

	if traitCollection.hasDifferentColorApperance(comparedTo: previousTraitCollection) {
		// Resolve dynamic colors again
	}
}