오늘 포스팅은 숫자의 소수점을 일정 자리까지 나타내는 법에 대해 작성하고자 합니다.
생각보다 굉장히 간단합니다. 바로 아래 코드처럼 작성해주시면 되는데요.
아래 코드는 정확히 묘사하면 소수 다섯재짜리에서 반올리하여 나타내준 것입니다.
// 소수 넷제자리까지 나타내기
Text("\(40294.392848223, specifier: "%.4f")") // 결과: 40294.3928
이렇게 끝맺음을 하면 아쉽기 때문에 조금 더 깊이 있게 들어가보겠습니다.
조금 더 깊이 들어가보자
LocalizedStringKey
SwiftUI의 Text 뷰에 대한 정의를 들어가보면 위와 같이 정의되어 있는 것을 확인해보실 수 있습니다.
여기서 눈에 띄는 타입이 바로 LocalizedStringKey인데요.
애플 공식문서에 따르면 LocalizedStringKey는 기본적으로 string 리터럴(literal)이 주어졌을 때 암시적(implicitly)으로 현지화된 string을 조회한다고 합니다.
하지만 위의 Text 예시를 잠시 다시 빌려와 살펴보자면, "\()"라는 문자열 보간법 구문(String Interpolation Syntax)가 사용되었기 때문에 LocalizedStringKey 타입을 받는 initializer가 실행되지는 않았을 것 같습니다.
// 소수 넷제자리까지 나타내기
Text("\(40294.392848223, specifier: "%.4f")") // 결과: 40294.3928
그렇다면 과연 어떤 initializer가 실행되었을까요?
Text 뷰의 다른 initializer 정의에 대해 살펴보도록 하겠습니다.
StringInterpolation
Text 뷰의 다른 intializer까지 살펴보니 StringInterpolation을 파라미터로 받는 initializer도 있었습니다.
자 그럼 여기서 StringInterpolation가 무엇이냐?!?!
정말 간단히 말해서 "\()" 문법을 의미합니다. 바로 이 문법을 String Interpolation 즉, 문자열 보간법이라고 합니다.
이 문자열 보간법을 이용하면 다른 string literal과 함께 사용이 가능해 개발시 더욱 가독성을 높일 수 있다는 장점이 있죠.
StringInterpolation과 LocalizedStringKey.init(stringInterpolation:)와 상관관계
자 그러면 우리가 살펴보았던 위의 LocalizedStringKey의 initializer와 무슨 상관관계이냐
애플 공식문서를 살펴보면 LocalizedStringKey에서 "\()" 문법이 사용되면 LocalizedStringKey.init(stringInterpolation:)가 호출되고, 그러면서 Swift는 표현식의 매개변수 유형을 LocalizedStringKey.StringInterpolation의 AppendInterpolation 메소드 중 하나와 일치시킨다고 합니다.
자 또 다른 키워드가 등장 했습니다. appendInterpolation 메소드. 과연 이것은 또 무엇일까요?
appendInterpolation 메소드
appendInterpolation 메소드는 StringInterpolation의 내장 메소드로 위에서 설명했던 것처럼 "\()" 문법 내부에 사용된 문법에 따라 일치할 때, 호출되는 메소드입니다.
// 소수 넷제자리까지 나타내기
Text("\(40294.392848223, specifier: "%.4f")") // 결과: 40294.3928
위에서 살펴보았던 처음 예제를 살펴보자면 위의 경우에는 appendInterpolation 메소드들 중 appendInterpolation(_:specifier:)가 호출되었을 것입니다.
추가적으로 appendInterpolation 메소드들 컴파일러가 알아서 호출해준다고 하니 왠만하면 직접 호출해서 사용하지 말아달라고 애플 공식 문서에서 주의를 주고 있습니다.
정리해보기
자 모든 키워드는 해제되었습니다. 이제 총 정리를 해보겠습니다.
// 소수 넷제자리까지 나타내기
Text("\(40294.392848223, specifier: "%.4f")") // 결과: 40294.3928
위와 같이 구문이 작성되면
위와 같이 LocalizedStringKey의 intializer중 LocalizedStringKey.init(stringInterpolation:)가 호출되고,
이 때 컴파일러는 위와 같이 작성된 것처럼 StringInterpolation의 appendInterpolation(_:specifier:)가 호출되게 됩니다.
마무리
이상 마무리하겠습니다.
여기까지 읽어주시기 쉽지 않으셨을텐데 혹시 읽어주셨다면 정말로 대단하십니다. 왜냐하면 이 글 작성하기가 개인적으로 쉽지 않았거든요 ㅎ
아무튼 비루한 글이지만 끝까지 읽어주셔서 정말 감사합니다!
참고 사이트
https://developer.apple.com/documentation/swiftui/localizedstringkey (애플 공식문서 - LocalizedStringKey)
https://developer.apple.com/documentation/swiftui/localizedstringkey/stringinterpolation?changes=latest_minor (애플 공식문서 - LocalizedStringKey.StringInterpolation)
https://developer.apple.com/documentation/swiftui/localizedstringkey/init(stringinterpolation:)?changes=latest_minor (애플 공식문서 - LocalizedStringKey.init(StringInterpolation:))
https://developer.apple.com/documentation/swiftui/localizedstringkey/stringinterpolation/appendinterpolation(_:specifier:) (애플 공식문서 - LocalizedStringKey.StringInterpolation.appendInterpolation(_:specifier:))
'TIL' 카테고리의 다른 글
[TIL] '손상되었기 때문에 열 수 없습니다. 해당 항목을 휴지통으로 이동해야 합니다.' 오류 해결법 (0) | 2024.06.08 |
---|---|
[TIL] Charts 적용기 (0) | 2024.06.07 |
[TIL] ForEach id 중복으로 인한 오류 해결 과정 (0) | 2024.06.07 |
[TIL] List 내부 ScrollView Horizontal Scroll 구현 (0) | 2024.06.07 |
[TIL] Moya 첫 적용기(feat. 사용법) (0) | 2024.06.04 |