[Swift] 첫 번째로 등장하는 문자열을 찾아 바꾸기

Ryan (Geonhee) Son·2021년 5월 2일
0

Study Stack

목록 보기
18/34

UILabel에 JSON 파일에서 디코딩한 내용을 텍스트로 넣어두었는데, 줄바꿈이 필요한 요소가 있다고 할 때, 여러분들은 어떻게 하시겠나요? 예를 들어, 아래 이미지에서 제목의 소괄호(를 기준으로 줄바꿈을 하고 싶다면요?


1. 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")
}

하지만 기획이 변경되어 소괄호가 아니라 대괄호 혹은 다른 구분 기호로 바뀐다면 이 코드는 변경되어야 하지 않을까요? 그럼 이 레이블 텍스트에서 가장 변경될 가능성이 적은 요소를 기준으로 줄바꿈을 하면 더 좋을 것 같네요.

2. 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
  )
}

이런 방법들을 적용해볼 수 있지만 가장 좋은 방법은 데이터를 주는 쪽과 협의하는 것이 가장 좋겠죠. 개발자가 자의적으로 판단해서 개발하는 것만큼 리스크가 큰 것도 따로 없을 것입니다.

그럼 오늘도 즐거운 하루 보내세요~!

profile
합리적인 해법 찾기를 좋아합니다.

0개의 댓글