SwiftUI.Text 에 Int 가 변수 전개된 String 를 건네주면 3 자리수 단락이 된다

6875 단어 iOSSwiftSwiftUI


도대체 어떻게 되어 있다면! !
print(String(1234))
// -> 1234
print("\(1234)")
// -> 1234

물론, 보통으로 변수 전개된 String 를 print 해도 3 자리수 단락은 되지 않습니다.



분명히, 변수 전개하고 있는 개소에 이 이상한 거동의 비밀이 있을 것 같습니다.

이 행동은 도대체 무엇입니까?



조사해 보니 여기 기사를 만났습니다. 굉장히 잘 정리되어 있고, Int 이외의 변수 전개에 대해서도 쓰여져 있으므로 꼭 이쪽도 봐 주세요. (텍스트 변수 확장에 이미지와 다른 텍스트 넣을 수 몰랐어 ...)

요약하면
  • SwiftUI.Text는 이니셜 라이저의 인수로 LocalizedStringKey를받습니다
  • LocalizedStringKeyExpressibleByStringInterpolation에 준거하는 형태로, StringInterpolationProtocol에 준거한 형 StringInterpolation를 내부적으로 가지고 있다
  • SwiftUI는 LocalizedStringKey.StringInterpolation를 확장하여 appendInterpolation를 정의하여 사용자 정의 변수 배포를 사용할 수 있습니다.

  • 이러한 구현에 의해, 커스터마이즈 된 변수 전개를 할 수 있게 되어 있습니다.

    게다가 이번 거동에 대해 소개



    SwiftUI에 정의되어 있는 appendInterpolation 에는 public mutating func appendInterpolation<T>(_ value: T) where T : _FormatSpecifiable 라는 메소드가 있어, 이번의 거동은 이것이 관계하고 있습니다.
    public protocol _FormatSpecifiable : Swift.Equatable {
        associatedtype _Arg : Swift.CVarArg
        var _arg: Self._Arg { get }
        var _specifier: Swift.String { get }
    }
    
    _FormatSpecifiable의 정의는 위와 같습니다.
    extension Int : SwiftUI._FormatSpecifiable
    extension Int8 : SwiftUI._FormatSpecifiable
    extension Int16 : SwiftUI._FormatSpecifiable
    extension Int32 : SwiftUI._FormatSpecifiable
    extension Int64 : SwiftUI._FormatSpecifiable
    extension UInt : SwiftUI._FormatSpecifiable
    extension UInt8 : SwiftUI._FormatSpecifiable
    extension UInt16 : SwiftUI._FormatSpecifiable
    extension UInt32 : SwiftUI._FormatSpecifiable
    extension UInt64 : SwiftUI._FormatSpecifiable
    extension Float : SwiftUI._FormatSpecifiable
    extension Double : SwiftUI._FormatSpecifiable
    extension CGFloat : SwiftUI._FormatSpecifiable
    
    Int 또는 Double와 같은 숫자 형식이 _FormatSpecifiable를 준수함을 알 수 있습니다.

    그건 그렇고, Double을 통과하면


    %.6f 상당의 포맷이 되어 있어 포맷의 되는 방법도 수치형에 따라서 달라 있는 것 같습니다.

    _FormatSpecifiable 를 확장한 구현의 내용까지는 확인할 수 없었습니다만, appendInterpolation 에는 그 밖에도 public mutating func appendInterpolation<T>(_ value: T, specifier: String) where T : _FormatSpecifiable 메소드가 나오고,



    와 같은 사용법을 할 수 있기 (위해)때문에, 각종의 수치형에 대해서 위와 같은 캐릭터 라인 포맷 지정자가 _specifier 로 각각 설정되어 있는 것이라고 생각됩니다.

    참고 자료


  • LocalizedStringKey.StringInterpolation | Apple Developer Documentation
  • [Swift] SwiftUI의 이상한 기능을 실현하는 변수 전개 "()"에 대해 조사했다 | Qiita
  • Localize Interpolated String: Why Only String Value Work? | Swift Forums
  • 좋은 웹페이지 즐겨찾기