Burt.K

Awesome Discovery

[SE-0039] 플레이그라운드 리터럴 현대화

작성일 — 2025년 3월 9일

Table of Contents

플레이그라운드 리터럴 현대화

소개

Playground 리터럴은 색상, 파일, 이미지를 토큰화한다. 드래그 앤 드롭 기능을 제공하며, 컨텍스트 내 시각화를 통해 플레이그라운드 콘텐츠를 설계할 때 쉽게 참고하고 조작할 수 있도록 돕는다. 현재 형태의 이 리터럴은 간단한 대괄호 구문을 사용하지만, 이는 컬렉션 리터럴과 충돌하는 문제가 있다. 이 제안은 #available과 #selector의 선례를 따라 플레이그라운드 리터럴을 재설계한다.

이 논의는 Swift Evolution 메일링 리스트의 [Discussion] Modernizing Playground Literals 스레드에서 진행되었다. 이 개선안을 제안한 Chris Lattner에게 감사드린다.

리뷰

동기

현재 색상, 이미지, 파일 리터럴은 다음과 같이 표현된다:

[#Color(colorLiteralRed: red, green: green, blue: blue, alpha: alpha)#]
[#Image(imageLiteral: localResourceNameAsString)#]
[#FileReference(fileReferenceLiteral: localResourceNameAsString)#]

플레이그라운드 리터럴은 다음과 같은 특징을 가진다:

이 접근 방식에는 몇 가지 문제가 있다:

상세 설계

생성자를 옥토소프로 구분된 식별자로 단순화하면 언어가 깔끔해지고, 문법 충돌 가능성을 줄이며, 모던 Swift에서 사용되는 다른 식별자와 일관성을 유지한다. 제안하는 식별자는 #colorLiteral, #imageLiteral, #fileLiteral이다.

color-literal  #colorLiteral(red: unit-floating-point-literal, green: unit-floating-point-literal, blue: unit-floating-point-literal, alpha: unit-floating-point-literal)
unit-floating-point-literal  0 이상 1 이하의 부동 소수점 숫자

image-literal  #imageLiteral(resourceName: image-resource-name)
image-resource-name  이미지 리소스 이름을 참조하는 정적 문자열 리터럴

file-literal  #fileLiteral(resourceName: file-resource-name)
file-resource-name  로컬 리소스 이름을 참조하는 정적 문자열 리터럴

이 설계에서:

그러나 이러한 인자 레이블은 실제 초기화자에는 적합하지 않다. 리터럴 프로토콜의 초기화자는 리터럴에서 사용됨을 명확히 나타내는 인자 레이블을 사용해야 한다. 이는 두 가지 목적을 달성한다. 첫째, 타입이 리터럴에 대해 특수한 동작을 제공하고 싶을 수 있으며, 이는 일반적인 초기화자에는 적합하지 않을 수 있다. 둘째, 리터럴 초기화자는 엄격한 명명 및 타입 규칙을 따라야 하므로, “특이한” 이름을 부여하면 타입의 표준 인터페이스를 오염시키지 않고 모호성을 줄일 수 있다. 이를 고려하여 Swift는 위의 구문을 아래의 해당 초기화자 사용으로 해석한다:

protocol _ColorLiteralConvertible {
  init(colorLiteralRed red: Float, green: Float, blue: Float, alpha: Float)
}

protocol _ImageLiteralConvertible {
  init(imageLiteralResourceName path: String)
}

protocol _FileReferenceLiteralConvertible {
  init(fileReferenceLiteralResourceName path: String)
}

고려한 대안

파일 리소스를 설명할 때 #fileliteral보다 #resourceliteral이 더 적합할 수 있다.