철이의 컴노리
  • 안녕하세요!
  • KOTLIN
  • ANDROID
    • Architecture Components
      • 프로젝트에 추가하기
      • 데이터 바인딩 라이브러리
        • 시작하기
        • 레이아웃 및 바인딩 표현식
      • 라이프 사이클 처리
      • ViewModel
    • CameraX
      • CameraX 아키텍처
      • 구성
      • 미리보기
      • 이미지 분석
      • 이미지 캡처
      • 제조 업체 확장 기능
    • View
      • 커스텀뷰의 크기 정하기
    • JNI 튜토리얼
      • 1장. 저자 소개
      • 2장. Hello JNI
      • 3장. 메서드 등록
      • 4장. int 데이터형 값 주고 받기
      • 5장. boolean 데이터형 값 주고 받기
      • 6장. double 데이터형 값 주고 받기
      • 7장. float 데이터형 값 주고 받기
      • 8장. long 데이터형 값 주고 받기
      • 9장. short 데이터형 값 주고 받기
      • 10장. char 데이터형 값 주고 받기
      • 11장. byte 데이터형 값 주고 받기
      • 12장. JNI에서 문자열 다루기 1/3
      • 13장. JNI에서 문자열 다루기 2/3
      • 14장. JNI에서 문자열 다루기 3/3
      • 15장. 레퍼런스 이해하기
      • 16장. 배열 다루기 1/4
      • 17장. 배열 다루기 2/4
      • 18장. 배열 다루기 3/4
      • 19장. 배열 다루기 4/4
      • 20장. 중간 요약
      • 21장. 자바 클래스 찾기 1/2
      • 22장. 자바 클래스 찾기 2/2
      • 23장. 정적 메서드 찾기
      • 24장. 정적필드 찾기
      • 25장. 자바 클래스 인스턴스 생성하기
      • 26장. 자바 클래스 인스턴스 메서드 찾기
      • 27장. 자바 클래스의 인스턴스 필드 찾기
      • 28장. 네이티브 쓰레드 실행하기
  • Swift
    • What' New
      • Swift 5.0
        • Result 타입
        • Raw 문자열
        • 커스텀 문자열 보간
    • Codable
      • 커스텀 타입 인코딩 및 디코딩
  • iOS
  • OpenGL
    • OpenGL Tutorial
      • 1장. 저자 소개
      • 2장. OpenGL 윈도우 프레임웍 만들기 1편
      • 3장. OpenGL 윈도우 프레임웍 만들기 2편
      • 4장. 점그리기
      • 5장. 선 그리기
      • 6장. 다각형 그리기
      • 7장. 색 표현하기
      • 8장. 3차원 폴리곤 그리기
      • 9장. 투영변환
      • 10장. 이동, 회전, 크기 변환
      • 11장. 빛, 재질 표현하기
      • 12장. 텍스춰매핑
    • OpenGL ES Tutorial for iOS
      • 1장. 저자 소개
      • 2장. 튜토리얼 소개
      • 3장. OpenGL|ES 개발 환경 만들기
      • 4장. 뷰 배경색상 변경하기
      • 5장. 투영에 대해서 1/2
      • 6장. 투영에 대해서 2/2
      • 7장. 선분 및 삼각형 그리기
      • 8장. 색상칠하기
      • 9장. 텍스춰맵핑
      • 10장. 종횡비
      • 11장. 텍스춰 UV좌표
      • 12장. 텍스춰매핑 파라미터
      • 13장. 깊이버퍼
      • 14장. 원근투영
  • ENV
    • oh-my-zsh
      • 특정 git 폴더에서 zsh 이 느려질 때
  • Ubuntu
    • UEFI USB
    • nvidia driver
    • /dev/kvm on Android Studio
    • install oracle-jdk8
  • chromium
    • javap
Powered by GitBook
On this page

Was this helpful?

  1. Swift
  2. What' New
  3. Swift 5.0

커스텀 문자열 보간

번역 중입니다 :)

PreviousRaw 문자열NextCodable

Last updated 6 years ago

Was this helpful?

은 Swift의 문자열 보간 시스템을 획기적으로 개선하였습니다. 더 효율적이고 유연한 시스템으로 이전에는 불가능했던 새로운 기능을 제공합니다. 새로운 문자열 보간 시스템을 사용하면 객체가 문자열에 나타나는 방식을 제어 할 수 있습니다.

Swift는 문자열 보간식 내에 구조체를 사용하면 구조체 이름과 모든 속성을 출력합니다. 디버깅을 돕고자 하는 스위프트의 기본 동작입니다. 그러나 클래스는 그렇지 않습니다. 문자열 보간식에 클래스를 지원하거나 문자열 보간식으로 출력되는 내용에 특정 형식을 적용하고자 할 때 Swift 5.0의 새로운 문자열 보간 시스템을 사용할 수 있습니다.

User 구조체를 정의해 봅시다.

struct User {
    var name: String
    var age: Int
}

User 구조체 인스턴스의 내용을 깔끔하게 출력하는 특별한 문자열 보간을 User 구조체에 추가해 봅시다. String.StringInterpolation을 확장하고 appendInterpolation() 메서드를 정의합니다.​

Swift는 이미 여러가지 기본으로 제공되는 메서드들을 가지고 있어서 User 구조체 인스턴스가 문자열 보간에 쓰일 때, 호출할 메서드를 찾게 됩니다.

이 예제의 경우 기본으로 제공되는 메서드 중 하나인 appendInterpolation()를 구현하여 사용자 이름과 나이를 문자열 하나로 출력합니다.

extension String.StringInterpolation {
    mutating func appendInterpolation(_ value: User) {
        appendInterpolation("My name is \(value.name) and I'm \(value.age)")
    }
}

이제 user를 생성하고 데이터를 출력 할 수 있습니다.

let user = User(name: "Guybrush Threepwood", age: 33)
print("User details: \(user)")

위 코드는 User details: My name is Guybrush Threepwood and I’m 33 라고 출력합니다. 커스텀 문자열 보간을 사용하여 출력된 것 입니다.

이 기능은 CustomStringConvertible 프로토콜을 구현하는 것과 다르지 않습니다. 그러나 커스텀 문자열 보간은 더 많은 고급 기능을 제공합니다.

커스텀 보간 메서드는 레이블이 있거나 또는 레이블이 없는 인자를 필요한만큼 받을 수 있습니다. 예를 들어, 다음과 같이 다양한 스타일을 사용하여 숫자를 출력하는 문자열 보간을 구현할 수 있습니다.

extension String.StringInterpolation {
    mutating func appendInterpolation(_ number: Int, style: NumberFormatter.Style) {
        let formatter = NumberFormatter()
        formatter.numberStyle = style

        if let result = formatter.string(from: number as NSNumber) {
            appendLiteral(result)
        }
    }
}

NumberFormatter 클래스는 통화(currency)($ 72.83), 서수(ordinal)(1st, 12th, ordinal) 및 발음(spell out)(five, forty-three)을 비롯한 많은 스타일을 갖고 있습니다. 그래서 다음처럼 난수를 발음으로 변경하여 문자열로 만들 수 있습니다.

let number = Int.random(in: 0...100)
let lucky = "The lucky number this week is \(number, style: .spellOut)."
print(lucky)

appendLiteral()을 필요에 따라 여러 번 호출하거나 아예 호출하지 않아도 됩니다. 다음처럼 문자열을 여러 번 반복하는 커스텀 문자열 보간을 구현할 수 있습니다.

extension String.StringInterpolation {
    mutating func appendInterpolation(repeat str: String, _ count: Int) {
        for _ in 0 ..< count {
            appendLiteral(str)
        }
    }
}

print("Baby shark \(repeat: "doo ", 6)")

appendInterpolation()은 일반 메서드이므로 Swift의 모든 기능을 사용할 수 있습니다. 예를 들어, 문자열 배열을 결합하는 커스텀 보간을 구현할 수 있습니다. 만약 배열이 비어 있으면 문자열을 반환하지 않고 클로저를 실행합니다.

extension String.StringInterpolation {
    mutating func appendInterpolation(_ values: [String], empty defaultValue: @autoclosure () -> String) {
        if values.count == 0 {
            appendLiteral(defaultValue())
        } else {
            appendLiteral(values.joined(separator: ", "))
        }
    }
}

let names = ["Harry", "Ron", "Hermione"]
print("List of students: \(names, empty: "No one").")

value.count 가 0일 경우에는 @autoclosure를 적용하여 defaultValue로 단순한 값을 사용하거나 복잡한 함수를 호출할 수 있습니다.

ExpressibleByStringLiteral과 ExpressibleByStringInterpolation 프로토콜을 결합하여 모든 타입이 문자열 보간을 사용하도록 만들 수 있습니다. 여기에 CustomStringConvertible 프로토콜을 추가하면 원하는 타입을 문자열로 출력 할 수 있습니다.

이를 위해 몇 가지 규칙을 지켜야 합니다.

SE-0228