[영화관] 아니 forEach나 for-in이나 하드코딩이나 똑같아야 하는 거 아님?

김하민·2024년 12월 17일
0

오늘도 알쏭달쏭 트러블슈팅에 오신 여러분을 환영합니다.

하...

배경 설명을 조금 하자면요,

요런 녀석을 만들어야 해서,

대충 요런 코드를 짜는 중이었습니다.

import UIKit

import SnapKit
import Then

final class ColorGuide: UIView {
    
    private let availableBox = UIView().then {
        $0.backgroundColor = .available
        $0.layer.cornerRadius = 4
    }
    
// 중략...
    
    private let availableLabel = UILabel().then {
        $0.text = "선택 가능"
        $0.textColor = ._100
    }
// 중략...

이렇게 네모 상자가 될 UIView와 그 옆에 붙을 UILabel을 만들어주고,

override init(frame: CGRect) {
	super.init(frame: frame)
	backgroundColor = .systemBackground
	setViews()
	setConstraints()
}

// 중략...
private func setViews() {
	[
		availableBox, availableLabel,
		unavailableBox, unavailableLabel,
		selectedBox, selectedBox
	].forEach { addSubview($0) }
}

private func setConstraints() {
	let boxSize: CGFloat = 12
	let boxLabelDistance: CGFloat = 7
	let leadingTrailingDistance: CGFloat = 16
        
        // 선택 가능
	availableBox.snp.makeConstraints { make in
		make.leading.equalToSuperview()
		make.size.equalTo(boxSize)
        make.centerY.equalToSuperview()
    }
    availableLabel.snp.makeConstraints { make in
    	make.leading.equalTo(availableBox.snp.trailing).offset(boxLabelDistance)
		make.centerY.equalToSuperview()
	}
    // 후략...
}

대충 이런 코드로 뷰를 넣어주고 constraints를 적용해주는 코드를 작성했습니다.

별 문제 없을 것 같아 보이지 않나요?

저도 그렇게 생각했습니다.

빨간색으로 왼뺨을 맞기 전까진요.

여차저차 이리저리 생각해서 가설을 내려봤습니다.

  1. 고차함수인 forEach를 쓰면 (.map이나 .filter처럼) 컴파일러의 최적화가 관여할 여지가 늘어나니,
  2. 어떻게 해서 뒤에 오는 setConstraints가 먼저 실행되어서,
  3. 각 요소들 중 일부가 subview로 들어가지 못했고,
  4. 결과적으로 들어가지 못 한 요소의 superview를 잡으려고 해서 그런 게 아닐까?

미리 스포하자면, 1번은 거짓이었습니다...
사유: 언제 forEach를 또는 for-in 반복문을 쓸 것이냐 & Swift source code
정리하면서 보니 소 뒷걸음질치다 쥐를 잡은 격이네요. 소띠라서그런가

그래서 하드코딩으로 해봤습니다.

어... 잘... 되네요...?

그럼 이론 상 같은 코드를 반복하여 실행해주는
for-in 반복문도 되어야 하는 것이겠죠?

근데 말이죠...

아니 믿었던 반복문 ㄴㅓ ㅁㅏ ㅈㅓ...
왼뺨을 맞고 눈물흘리며 찾아간 친구가 오른뺨 마저도 때려주는 기분이네요.

원인의 실마리가 미궁 속으로 빠져버렸습니다...
근데 오늘은 너무나도 졸린 나머지 다음에 이어서 알아보도록 하겠습니다...

2개의 댓글

comment-user-thumbnail
2024년 12월 22일

뭐야 [].forEach { addSubview($0) } 해주는 함수 따로 정의하고 제약조건 함수 따로 정의하는 거까지 싱크 100퍼 저랑 똑같은데요 나는 저렇게 살아왔는데? fatal error 뭐야!!!!!!!

1개의 답글