· 1 min learn
This time I’ll present you a behavioral sample. Here’s a little instance of the command design patten written in Swift.
The command sample may be useful in the event you’d like to offer a standard interface for various actions that can be executed later in time. Normally it’s an object that encapsulates all the knowledge wanted to run the underlying motion correctly.
Instructions are sometimes used to deal with consumer interface actions, create undo managers, or handle transactions. Let’s see a command sample implementation in Swift by making a command line argument handler with emojis. 💾
#!/usr/bin/env swift
import Basis
protocol Command {
func execute()
}
class HelpCommand: Command {
func execute() {
Assist().data()
}
}
class Assist {
func data() {
print("""
🤖 Commander 🤖
v1.0
Obtainable instructions:
👉 assist This command
👉 ls Record paperwork
Bye! 👋
""")
}
}
class ListCommand: Command {
func execute() {
Record().homeDirectoryContents()
}
}
class Record {
func homeDirectoryContents() {
let fileManager = FileManager.default
guard let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else {
print("Couldn't open paperwork listing")
exit(-1)
}
do {
let fileURLs = strive fileManager.contentsOfDirectory(at: documentsURL, includingPropertiesForKeys: nil)
print("nt📁 Itemizing paperwork listing:n")
print(fileURLs.map { "tt💾 " + $0.lastPathComponent }.joined(separator: "nn") + "n" )
}
catch {
print(error.localizedDescription)
exit(-1)
}
}
}
class App {
var instructions: [String:Command] = [:]
init() {
self.instructions["help"] = HelpCommand()
self.instructions["ls"] = ListCommand()
}
func run() {
let arguments = CommandLine.arguments[1...]
guard let key = arguments.first, self.instructions[key] != nil else "))]")
exit(-1)
self.instructions[key]!.execute()
}
}
App().run()
For those who save this file, can run it by merely typing ./file-name.swift
from a terminal window. The Swift compiler will maintain the remaining.
Actual world use instances for the command design sample:
+ numerous button actions
+ assortment / desk view choice actions
+ navigating between controllers
+ historical past administration / undo supervisor
+ transactional habits
+ progress administration
+ wizards
As you’ll be able to see this sample may be utilized in a number of areas. Apple even made a particular class for this goal referred to as NSInvocation, however sadly it’s not accessible in Swift, because of it’s dynamic habits. That’s not an enormous deal, you’ll be able to all the time make your individual protocol & implementation, usually you simply want one further class that wraps the underlying command logic. 😛
Associated posts
On this article I’m going to indicate you tips on how to implement a primary occasion processing system on your modular Swift utility.
Study the iterator design sample through the use of some customized sequences, conforming to the IteratorProtocol from the Swift normal library.
Learn to use lazy properties in Swift to enhance efficiency, keep away from optionals or simply to make the init course of extra clear.
Newbie’s information about optics in Swift. Learn to use lenses and prisms to govern objects utilizing a practical strategy.