├── Basic Template.xctemplate ├── TemplateInfo.plist └── ___FILEBASENAME___.swift ├── LICENSE ├── README.md └── View, Model & ViewModel.xctemplate ├── Code ├── ___FILEBASENAME___.swift ├── ___FILEBASENAME___View.swift └── ___FILEBASENAME___ViewModel.swift ├── Storyboard ├── ___FILEBASENAME___.swift ├── ___FILEBASENAME___View.swift └── ___FILEBASENAME___ViewModel.swift ├── TemplateInfo.plist ├── XIB file ├── ___FILEBASENAME___.swift ├── ___FILEBASENAME___View.swift └── ___FILEBASENAME___ViewModel.swift ├── XIB filegenerateXIBfile ├── ___FILEBASENAME___.swift ├── ___FILEBASENAME___View.swift ├── ___FILEBASENAME___View.xib └── ___FILEBASENAME___ViewModel.swift └── base ├── model.swift └── viewModel.swift /Basic Template.xctemplate/TemplateInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Kind 6 | Xcode.IDEKit.TextSubstitutionFileTemplateKind 7 | DefaultCompletionName 8 | Basic 9 | AllowedTypes 10 | 11 | public.swift-source 12 | public.c-header 13 | 14 | Platforms 15 | 16 | com.apple.platform.iphoneos 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /Basic Template.xctemplate/___FILEBASENAME___.swift: -------------------------------------------------------------------------------- 1 | // ___FILEHEADER___ 2 | 3 | import Foundation 4 | 5 | class ___FILEBASENAMEASIDENTIFIER___ { 6 | 7 | } 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Jean-Étienne 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Xcode 9 File Template Examples 2 | 3 | Examples templates used in [my blog article](http://jeanetienne.net/2017/09/10/xcode-templates.html). 4 | -------------------------------------------------------------------------------- /View, Model & ViewModel.xctemplate/Code/___FILEBASENAME___.swift: -------------------------------------------------------------------------------- 1 | // ___FILEHEADER___ 2 | 3 | import Foundation 4 | 5 | class ___FILEBASENAMEASIDENTIFIER___ { 6 | 7 | } 8 | -------------------------------------------------------------------------------- /View, Model & ViewModel.xctemplate/Code/___FILEBASENAME___View.swift: -------------------------------------------------------------------------------- 1 | // ___FILEHEADER___ 2 | 3 | import UIKit 4 | 5 | class ___FILEBASENAMEASIDENTIFIER___: UIView { 6 | 7 | init() { 8 | // init for a view instanciated in code 9 | } 10 | 11 | func configure(withViewModel viewModel: ___VARIABLE_productName:identifier___ViewModel) { 12 | // configure the view with a ___VARIABLE_productName:identifier___ViewModel 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /View, Model & ViewModel.xctemplate/Code/___FILEBASENAME___ViewModel.swift: -------------------------------------------------------------------------------- 1 | // ___FILEHEADER___ 2 | 3 | import Foundation 4 | 5 | class ___FILEBASENAMEASIDENTIFIER___ { 6 | 7 | private let model: ___VARIABLE_productName:identifier___ 8 | 9 | init(with___VARIABLE_productName:identifier___ aModel: ___VARIABLE_productName:identifier___) { 10 | model = aModel 11 | 12 | // Add you own ViewModel logic for a ___VARIABLE_productName:identifier___. 13 | // ... 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /View, Model & ViewModel.xctemplate/Storyboard/___FILEBASENAME___.swift: -------------------------------------------------------------------------------- 1 | // ___FILEHEADER___ 2 | 3 | import Foundation 4 | 5 | class ___FILEBASENAMEASIDENTIFIER___ { 6 | 7 | } 8 | -------------------------------------------------------------------------------- /View, Model & ViewModel.xctemplate/Storyboard/___FILEBASENAME___View.swift: -------------------------------------------------------------------------------- 1 | // ___FILEHEADER___ 2 | 3 | import UIKit 4 | 5 | class ___FILEBASENAMEASIDENTIFIER___: UIView { 6 | 7 | init() { 8 | // init for a view instanciated by the Storyboard 9 | } 10 | 11 | func configure(withViewModel viewModel: ___VARIABLE_productName:identifier___ViewModel) { 12 | // configure the view with a ___VARIABLE_productName:identifier___ViewModel 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /View, Model & ViewModel.xctemplate/Storyboard/___FILEBASENAME___ViewModel.swift: -------------------------------------------------------------------------------- 1 | // ___FILEHEADER___ 2 | 3 | import Foundation 4 | 5 | class ___FILEBASENAMEASIDENTIFIER___ { 6 | 7 | private let model: ___VARIABLE_productName:identifier___ 8 | 9 | init(with___VARIABLE_productName:identifier___ aModel: ___VARIABLE_productName:identifier___) { 10 | model = aModel 11 | 12 | // Add you own ViewModel logic for a ___VARIABLE_productName:identifier___. 13 | // ... 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /View, Model & ViewModel.xctemplate/TemplateInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Kind 6 | Xcode.IDEKit.TextSubstitutionFileTemplateKind 7 | Platforms 8 | 9 | com.apple.platform.iphoneos 10 | 11 | Options 12 | 13 | 14 | Identifier 15 | productName 16 | Required 17 | 18 | Name 19 | Model: 20 | Description 21 | The name of the Model, View and ViewModel to create 22 | Type 23 | text 24 | Default 25 | MyModel 26 | 27 | 28 | Identifier 29 | viewType 30 | Required 31 | 32 | Name 33 | View type: 34 | Description 35 | The type of view to use 36 | Type 37 | popup 38 | Default 39 | Storyboard 40 | Values 41 | 42 | Storyboard 43 | XIB file 44 | Code 45 | 46 | 47 | 48 | Identifier 49 | generateXIBfile 50 | Name 51 | Also create a XIB file 52 | Description 53 | Whether to create a XIB file with the same name 54 | Type 55 | checkbox 56 | RequiredOptions 57 | 58 | viewType 59 | 60 | XIB file 61 | 62 | 63 | 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /View, Model & ViewModel.xctemplate/XIB file/___FILEBASENAME___.swift: -------------------------------------------------------------------------------- 1 | // ___FILEHEADER___ 2 | 3 | import Foundation 4 | 5 | class ___FILEBASENAMEASIDENTIFIER___ { 6 | 7 | } 8 | -------------------------------------------------------------------------------- /View, Model & ViewModel.xctemplate/XIB file/___FILEBASENAME___View.swift: -------------------------------------------------------------------------------- 1 | // ___FILEHEADER___ 2 | 3 | import UIKit 4 | 5 | class ___FILEBASENAMEASIDENTIFIER___: UIView { 6 | 7 | init() { 8 | // init for a view instanciated from a XIB file 9 | } 10 | 11 | func configure(withViewModel viewModel: ___VARIABLE_productName:identifier___ViewModel) { 12 | // configure the view with a ___VARIABLE_productName:identifier___ViewModel 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /View, Model & ViewModel.xctemplate/XIB file/___FILEBASENAME___ViewModel.swift: -------------------------------------------------------------------------------- 1 | // ___FILEHEADER___ 2 | 3 | import Foundation 4 | 5 | class ___FILEBASENAMEASIDENTIFIER___ { 6 | 7 | private let model: ___VARIABLE_productName:identifier___ 8 | 9 | init(with___VARIABLE_productName:identifier___ aModel: ___VARIABLE_productName:identifier___) { 10 | model = aModel 11 | 12 | // Add you own ViewModel logic for a ___VARIABLE_productName:identifier___. 13 | // ... 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /View, Model & ViewModel.xctemplate/XIB filegenerateXIBfile/___FILEBASENAME___.swift: -------------------------------------------------------------------------------- 1 | // ___FILEHEADER___ 2 | 3 | import Foundation 4 | 5 | class ___FILEBASENAMEASIDENTIFIER___ { 6 | 7 | } 8 | -------------------------------------------------------------------------------- /View, Model & ViewModel.xctemplate/XIB filegenerateXIBfile/___FILEBASENAME___View.swift: -------------------------------------------------------------------------------- 1 | // ___FILEHEADER___ 2 | 3 | import UIKit 4 | 5 | class ___FILEBASENAMEASIDENTIFIER___: UIView { 6 | 7 | init() { 8 | // init for a view instanciated from a XIB file 9 | } 10 | 11 | func configure(withViewModel viewModel: ___VARIABLE_productName:identifier___ViewModel) { 12 | // configure the view with a ___VARIABLE_productName:identifier___ViewModel 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /View, Model & ViewModel.xctemplate/XIB filegenerateXIBfile/___FILEBASENAME___View.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /View, Model & ViewModel.xctemplate/XIB filegenerateXIBfile/___FILEBASENAME___ViewModel.swift: -------------------------------------------------------------------------------- 1 | // ___FILEHEADER___ 2 | 3 | import Foundation 4 | 5 | class ___FILEBASENAMEASIDENTIFIER___ { 6 | 7 | private let model: ___VARIABLE_productName:identifier___ 8 | 9 | init(with___VARIABLE_productName:identifier___ aModel: ___VARIABLE_productName:identifier___) { 10 | model = aModel 11 | 12 | // Add you own ViewModel logic for a ___VARIABLE_productName:identifier___. 13 | // ... 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /View, Model & ViewModel.xctemplate/base/model.swift: -------------------------------------------------------------------------------- 1 | // ___FILEHEADER___ 2 | 3 | import Foundation 4 | 5 | class ___FILEBASENAMEASIDENTIFIER___ { 6 | 7 | } 8 | -------------------------------------------------------------------------------- /View, Model & ViewModel.xctemplate/base/viewModel.swift: -------------------------------------------------------------------------------- 1 | // ___FILEHEADER___ 2 | 3 | import Foundation 4 | 5 | class ___FILEBASENAMEASIDENTIFIER___ { 6 | 7 | private let model: ___VARIABLE_productName:identifier___ 8 | 9 | init(with___VARIABLE_productName:identifier___ aModel: ___VARIABLE_productName:identifier___) { 10 | model = aModel 11 | 12 | // Add you own ViewModel logic for a ___VARIABLE_productName:identifier___. 13 | // ... 14 | } 15 | 16 | } 17 | --------------------------------------------------------------------------------