UILabel
에 JSON 파일에서 디코딩한 내용을 텍스트로 넣어두었는데, 줄바꿈이 필요한 요소가 있다고 할 때, 여러분들은 어떻게 하시겠나요? 예를 들어, 아래 이미지에서 제목의 소괄호(
를 기준으로 줄바꿈을 하고 싶다면요?
replacingOccurences(in:with:)
먼저 String
타입에 적용할 수 있는 replacingOccurences(in:with:)
메서드를 활용할 수 있습니다. 목표한 좌측 소괄호를 기준으로 문자열을 변경해줄 수 있겠죠. 아래 코드처럼요!
private func configureTitleLabel(with data: ExpoIntroduction) {
titleLabel.text = data.title
titleLabel.text = titleLabel.text?.replacingOccurrences(in: "(", with "(\n")
}
하지만 기획이 변경되어 소괄호가 아니라 대괄호 혹은 다른 구분 기호로 바뀐다면 이 코드는 변경되어야 하지 않을까요? 그럼 이 레이블 텍스트에서 가장 변경될 가능성이 적은 요소를 기준으로 줄바꿈을 하면 더 좋을 것 같네요.
replacingOccurences(of:with:range:)
+ range(of:)
제가 생각하기에 1900
이라는 내용은 고유한 내용이므로 바뀌지 않을 가능성이 클 것 같습니다. 하지만 1900
을 기준으로 replacingOccurences(in:with:)
메서드를 적용하면 두 번째로 등장하는 1900
이라는 텍스트에도 영향을 미치니 보완할 방법을 찾아야겠습니다. 이렇게 생각해보면 어떨까요?
1900
을 기준으로 줄바꿈을 한다.그럼 첫 번째로 등장하는
이라는 조건을 만족시키기 위해 String
타입의 range(of:)
메서드에 대해 알아봅시다.
range(of:)
메서드는 다른 부가 매개변수들을 활용하여 검색 범위를 달리할 수 있지만 of:
매개변수에만 인자를 전달하면 첫 번째 요소까지의 범위를 반환해줍니다. 그럼 아래와 같이 코드를 완성할 수 있죠.
private func configureTitleLabel(with data: ExpoIntroduction) {
titleLabel.text = data.title
let newLineTargetString = titleLabel.text?.range(of: "1900")
titleLabel.text = titleLabel.text?.replacingOccurrences(
of: "1900",
with: "1900\n",
range: newLineTargetString
)
}
이런 방법들을 적용해볼 수 있지만 가장 좋은 방법은 데이터를 주는 쪽과 협의하는 것이 가장 좋겠죠. 개발자가 자의적으로 판단해서 개발하는 것만큼 리스크가 큰 것도 따로 없을 것입니다.
그럼 오늘도 즐거운 하루 보내세요~!