.xctemplate

2025. 3. 22. 00:22·iOS
반응형

👋 들어가기 전

항상 RIBs의 개념에서 필요한 것만 갔다 썼기때문에 쓰지 않은 것에 대해서는

그 때 그 때 알아봤다.

 

그런데 공식문서에서 눈이 가는 한가지 사진이 있다.

항상 Xcode에서 제공해주는 내용만 있을 줄 알았는데

 

저기를 건드릴 수가 있네 ??

 

더 늦으면 인생 절반 손해볼뻔 했다.. 

당장 알아보자.


✊무엇일까?

제목을 보면 대충 유추할 수 있다.  바로 파일을 만드는 템플릿이다.


☝️그래서 어디에 있는데?

/Applications/Xcode.app/Contents/Developer/Library/Xcode/Templates

~/Library/Developer/Xcode

 

일단 여기가 시작 포인트!

 

이후 Templates 폴더를 만들어준다.

mkdir -p ~/Library/Developer/Xcode/Templates

✌️.xctemplate 디렉토리 만들기

일단 RIBS를 만드는 느낌으로 가보자.

RIBs.xctemplate으로 만들어보자.

 

현재 이런 구조이다.


👍구성 요소

✨ 아이콘

첫번 째 구성요소는 바로 아이콘이다.

RIB의 아이콘을 사용하는 것 같으니 그대로 넣어보자.

TemplateIcon이라는 이름으로 넣어줬다.

📌 플레이스 홀더

이렇게 우리는 파일을 만들기 위해 이렇게 입력을 받는데
Xcode와 RIBs에서는 저 값을 이용해 파일을 만들 때 알맞은 위치에 넣어주는 것을 우리는 볼 수 있었다.

 

그 역할을 하는 것 중 하나가 바로 플레이스 홀더이다.

 

여기서 기본적으로 제공해주는 플레이스 홀더와 커스텀으로 사용하는
플레이스 홀더를 한번  분리해서 알아보자.

 

기본 제공 플레이스 홀더

플레이스홀더 설명 예시
___FILENAME___ 현재 파일의 전체 이름 (확장자 포함) MyViewController.swift
___FILEBASENAME___ 파일의 기본 이름(확장자 제외) MyViewController
___FILEBASENAMEASIDENTIFIER___ 파일 이름을 식별자로 사용 MyViewController
___PROJECTNAME___ 현재 프로젝트 이름 MyApp
___FULLUSERNAME___ 현재 macOS 사용자 이름 Hamp
___DATE___ 현재 날짜 2025-01-01
___YEAR___ 현재 연도 2025
___ORGANIZATIONNAME___
프로젝트 조직 이름 MyCompany

커스텀 플레이스 홀더

이 부분은 3번째 구성요소인 .plist쪽과 같이 설명해야하지만 간단하게 커스텀 플레이스 홀더 형태만 보자.

 

___VARIABLE_Identifier___

 

바로 이 형태이다. 여기서 Identifier를 .plist에 기록한 내용과 비교하여 알맞은 값으로 대체된다.

 

📋.plist

plist의 key값이 어떤걸 의미하는 지 알아보자.

DefaultCompletionName (String, required)

  • 파일의 기본 이름으로 사용되는 값

Description (String, required)

  • 설명

Kind (String, required)

  • 템플릿 종류를 의미하며 파일 or 프로젝트를 의미한다.

 

파일 템플릿일 경우

  • Xcode.IDEFoundation.TextSubstitutionFileTemplateKind

아직 프로젝트는 찾지 못했다..

Summary (String, required)

  • 요약

MainTemplateFile (String)

  • 템플릿 파일이 2개 이상일 경우, 생성 후 보여질 파일을 지정

SortOrder (String, required)

  • 템플릿 파일이 그룹안에서 어떤 놈이 왼쪽 (먼저) 배치 될지 값이 작을수록 먼저
  • 값이 같다면 나중에 추가된게 먼저 배치 

Options (Array)

  • 여기가 하이라이트 Identifier를 이용해 외부에서 값을 받아 넣어주는 영역

Item (Dictionary)

  • Name : 입력 받을 필드 (String)
  • Description: 설명 (String)
  • Type: 어떤 형태로 입력 받을지 (String)
    • text: 텍스트 필드
    • checkbox: 체크 박스
    • static: 수정 불가 
    • combo: 텍스트 필드 + popup 느낌 ??
    • popup: 드랍다운 메뉴
  • Required: 필수 여부 (Boolean)
  • Identifier: 식별자 (String)


✅ 결과

일단 Xcode 상에서 잘 보이긴한다 ??

 

왼쪽에 Item0에 있는 Name이 있다.

Item1이 하나 더 있으면 아래 필드가 하나 더 생길 듯??

 

저장하는 곳에 DefulatCompletionName의 값이 있다.

이렇게 보니 Key 변수 이름 잘 설정한 듯 ??

템플릿 swift가 이렇게 생겼다.

한번 어떤 값이 들어오는 지 사진을 봐보자.

// ___FILEBASENAME___.swift [실제로는 없는 주석 그냥 파일 이름이 저렇게 되어 있음]

//  ___FILENAME___
//  ___PROJECTNAME___
//
//  Created by ___FULLUSERNAME___ on ___DATE___.
//

import SwiftUI

struct ___VARIABLE_className:identifier___Class: View {

    var body: some View {
        Text("커스텀하시어요")
    }
}

 

결과를 보면 className에 입력한 FileA가
___VARIABLE_className:identifier___Class(className Identifier 플레이스 홀더)로
들어와 struct 명으로 들어왔다.

 

이후 Save As에 입력한 TestA는 ___FILEBASENAME___플레이스 홀더에 들어왔다.


💉 실제 사용

이 포스팅을 쓴 이후, 실제로 써본 후기를 남겨놓는다.

 

나는 NeedleFramework관련 템플릿을 만들었다.

___FILEBASENAME___.swift

//___FILEHEADER___

import NeedleFoundation
import SwiftUI

public protocol ___VARIABLE_component:identifier___Dependency: Dependency {}

@MainActor
public final class ___VARIABLE_component:identifier___Component: Component<___VARIABLE_component___Dependency> {}

TemplateInfo.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>SupportsSwiftPackage</key>
    <true/>
    <key>Description</key>
    <string>An Interface Builder document for creating an iOS view.</string>
    <key>MainTemplateFile</key>
    <string>___FILEBASENAME___.swift</string>
    <key>SortOrder</key>
    <integer>10</integer>
    <key>Platforms</key>
    <array>
        <string>com.apple.platform.iphoneos</string>
    </array>
    <key>Options</key>
    <array>
        <dict>
            <key>Identifier</key>
            <string>component</string>
            <key>Required</key>
            <true/>
            <key>Name</key>
            <string>Prefix:</string>
            <key>Description</key>
            <string>접두어를 입력해주세요.</string>
            <key>Type</key>
            <string>text</string>
            <key>NotPersisted</key>
            <true/>
        </dict>
    </array>
</dict>
</plist>

 

여기서 흥미로운 점은 Identifier값을 productName 사용하면, 별도의 파일 명을 입력받지 않아도, 
해당 값으로 파일이 초기화된다.

 

정확한 이유는 모르겠따.. 😂

 

출처 첫번 째 페이지 링크를 가보면 아래와 같은 사진이 있다.

 

내 가설이 맞았다. productName으로 identifier를 사용하면 별도의 파일 이름은 입력받지 않는다.

 

이때 ___FILEBASENAME___을 사용하면 그대로 얻을 수 있다.


😀 소감 및 마무리

더욱 많은 템플릿을 추후 다른 프로젝트에서 많이 써보고 싶다.

 

생각보다 쉬운데?? 

 

내가 RIBs 템플릿 만든 것 같은 느낌


출처

http://jeanetienne.net/2017/09/10/advanced-xcode-template.html

 

Advanced Xcode 9 File Template (Part 2) | Jean-Étienne's Blog

In the first part of this article (Simple Xcode 9 File Template) we saw how to create a simple Xcode File Template to generate a custom file. Let’s go beyond the Copy/Paste type of template, and see what we can do to make a more dynamic template with opt

jeanetienne.net

https://zeddios.tistory.com/930

 

Xcode ) Custom File Template만들어보기

안녕하세요 :) Zedd입니다. 쓰고있는 글이;; 많긴 한데 마무리가 안되네요. 힝구 오늘 좀 고민을 해봤는데... 어떤 사람이 ViewController를 만들 때 A와 B나 C같은걸(클래스, 프로토콜) 미리 상속or채택

zeddios.tistory.com

 

 

 

반응형

'iOS' 카테고리의 다른 글

DEFINES_MODULE was set 경고  (0) 2025.03.02
시뮬레이터 vs 에뮬레이터  (1) 2025.01.26
샌드박스와 파일시스템  (0) 2025.01.26
리팩토링 결과 발표  (0) 2025.01.11
패키지 만들기  (1) 2025.01.07
'iOS' 카테고리의 다른 글
  • DEFINES_MODULE was set 경고
  • 시뮬레이터 vs 에뮬레이터
  • 샌드박스와 파일시스템
  • 리팩토링 결과 발표
Hamp
Hamp
남들에게 보여주기 부끄러운 잡다한 글을 적어 나가는 자칭 기술 블로그입니다.
  • Hamp
    Hamp의 분리수거함
    Hamp
  • 전체
    오늘
    어제
    • 분류 전체보기 (304)
      • CS (30)
        • 객체지향 (2)
        • Network (7)
        • OS (6)
        • 자료구조 (1)
        • LiveStreaming (3)
        • 이미지 (1)
        • 잡다한 질문 정리 (0)
        • Hardware (2)
        • 이론 (6)
        • 컴퓨터 그래픽스 (0)
      • Firebase (3)
      • Programing Langauge (37)
        • swift (32)
        • python (4)
        • Kotlin (1)
      • iOS (132)
        • UIKit (37)
        • Combine (1)
        • SwiftUI (32)
        • Framework (7)
        • Swift Concurrency (22)
        • Tuist (6)
        • Setting (11)
        • Modularization (1)
        • Instruments (6)
      • PS (59)
        • 프로그래머스 (24)
        • 백준 (13)
        • LeetCode (19)
        • 알고리즘 (3)
      • Git (18)
        • 명령어 (4)
        • 이론 (2)
        • hooks (1)
        • config (2)
        • action (7)
      • Shell Script (2)
      • Linux (6)
        • 명령어 (5)
      • Spring (13)
        • 어노테이션 (1)
        • 튜토리얼 (11)
      • CI-CD (4)
      • Android (0)
        • Jetpack Compose (0)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    boostcamp
    SwiftUI
    프로그래머스
    투포인터
    property
    UIKit
    Swift
    protocol
    dp
    IOS
    concurrency
    GIT
    dispatch
    lifecycle
    AVFoundation
    dfs
    CS
    Tuist
    Spring
    백준
  • 최근 댓글

  • 최근 글

  • 반응형
  • hELLO· Designed By정상우.v4.10.0
Hamp
.xctemplate
상단으로

티스토리툴바