Swiftorial Logo
Home
Swift Lessons
Tutorials
Learn More
Career
Resources
Creating Swift Packages

Creating Swift Packages

Introduction

Swift Packages are a powerful way to share and manage code in Swift. They allow developers to create modular, reusable components that can be easily integrated into other projects. This tutorial will guide you through the process of creating a Swift package from start to finish.

Prerequisites

Before we begin, ensure you have the following installed on your machine:

  • Xcode (version 11 or higher)
  • Command Line Tools for Xcode
  • Basic knowledge of Swift programming language

Step 1: Creating a New Swift Package

To create a new Swift package, you can use the Swift Package Manager (SPM) command line tool. Open your terminal and navigate to the directory where you want to create your package. Then run the following command:

swift package init --type library

This command initializes a new Swift package of type library.

Example Output:

                    Created package: MyLibrary
                    ├── Package.swift
                    ├── Sources
                    │   └── MyLibrary
                    │       └── MyLibrary.swift
                    └── Tests
                        └── MyLibraryTests
                            └── MyLibraryTests.swift
                    

Step 2: Understanding the Package Structure

After running the initialization command, your package will have the following structure:

  • Package.swift: The manifest file that describes your package's configuration, dependencies, and targets.
  • Sources: This directory contains the source files for your package. Each subdirectory corresponds to a target.
  • Tests: This directory contains test files for your package. Each subdirectory corresponds to a test target.

Step 3: Modifying the Package.swift File

Open the Package.swift file in your favorite text editor or Xcode. This file contains metadata about your package. Here's an example of a simple package configuration:

Example Package.swift:

                    // swift-tools-version:5.3
                    import PackageDescription

                    let package = Package(
                        name: "MyLibrary",
                        products: [
                            .library(
                                name: "MyLibrary",
                                targets: ["MyLibrary"]),
                        ],
                        dependencies: [],
                        targets: [
                            .target(
                                name: "MyLibrary",
                                dependencies: []),
                            .testTarget(
                                name: "MyLibraryTests",
                                dependencies: ["MyLibrary"]),
                        ]
                    )
                    

In this example, we define a library product named MyLibrary and specify its targets.

Step 4: Writing Code

Next, add functionality to your library. Open the file MyLibrary.swift located in the Sources/MyLibrary directory and add the following code:

Example MyLibrary.swift:

                    import Foundation

                    public struct Greeter {
                        public let greeting: String

                        public init(greeting: String) {
                            self.greeting = greeting
                        }

                        public func greet(name: String) -> String {
                            return "\(greeting), \(name)!"
                        }
                    }
                    

This code defines a simple structure Greeter that can greet users with a customizable message.

Step 5: Writing Tests

It's essential to write tests for your code. Open the file MyLibraryTests.swift located in the Tests/MyLibraryTests directory and add the following test case:

Example MyLibraryTests.swift:

                    import XCTest
                    @testable import MyLibrary

                    final class MyLibraryTests: XCTestCase {
                        func testGreeting() {
                            let greeter = Greeter(greeting: "Hello")
                            XCTAssertEqual(greeter.greet(name: "World"), "Hello, World!")
                        }
                    }
                    

This test checks that the greet method of the Greeter struct produces the expected output.

Step 6: Building and Testing the Package

To build your Swift package, navigate to the package directory in your terminal and run the following command:

swift build

After building, run the tests using the following command:

swift test

If everything is set up correctly, you should see output indicating that the tests have passed.

Example Output:

                    Test Suite 'All tests' passed at 2023-10-01 12:00:00.
                    All tests passed.
                    

Conclusion

You've successfully created a Swift package, written code, and tested it. Swift Packages allow you to modularize your code and share it with others easily. You can now explore more advanced features, like adding dependencies or creating executable targets as you continue your journey with Swift.