# Swift Defining Functions: Syntax, Parameters, and Return Values

Source: https://devdocs10.com/articles/swift/swift-defining-functions  
By Murat Bo · Published 2026-05-13 · DevDocs10 (https://devdocs10.com)

Functions are one of the most important building blocks in Swift. They let you group related code into a reusable unit, give that unit a clear name, and call it whenever you need the same behavior again. In this article, you will learn how to define functions in Swift, how parameters and return values work, how argument labels affect function calls, and how to avoid the mistakes beginners often make.

> **Quick answer:** In Swift, you define a function with the `func` keyword, a function name, optional parameters, and an optional return type. A basic function looks like this: `func greet() { ... }`, and a function with input and output looks like `func add(a: Int, b: Int) -> Int { ... }`.

> **Difficulty:** Beginner
>
> **Helpful to know first:** You'll understand this better if you know basic Swift syntax, how variables store values, and simple types such as `String`, `Int`, and `Bool`.

## 1. What Is Defining Functions?

Defining a function means creating a named block of code that performs a specific task. Instead of repeating the same statements many times, you write them once inside a function and call that function whenever needed.

- A function has a name so you can call it later.
- A function can accept input values called parameters.
- A function can send a value back using a return value.
- A function can also perform work without returning anything.
- In Swift, functions are declared with the `func` keyword.

For example, if your program needs to format a username in several places, you can define one function for that job instead of rewriting the logic each time.

> A closely related idea is the difference between a function and a method. A function is a reusable block of code in general, while a method is a function attached to a type such as a `struct` or `class`. The syntax for defining them is very similar, but this article stays focused on defining standalone Swift functions.

## 2. Why Defining Functions Matters

Functions matter because they make your code easier to read, test, reuse, and maintain. Even in a small Swift program, repeating logic quickly becomes hard to manage.

When you define functions well, each function handles one clear job. That makes your code easier to reason about and easier to update later. If a calculation changes, you update one function instead of hunting through many repeated blocks.

Functions are especially useful when:

- You repeat the same logic in multiple places.
- You want a clear name for a task, such as `calculateTotal` or `isValidEmail`.
- You want to separate input, processing, and output.
- You want to test one piece of logic independently.
- You want to make larger programs easier to organize.

You should not create a new function for every tiny expression if it makes the code harder to follow. The goal is meaningful reuse and clearer structure, not function count.

## 3. Basic Syntax

Swift function definitions follow a consistent structure. You start with `func`, add the function name, place parameters in parentheses, optionally declare a return type with `->`, and then write the function body in braces.

### A function with no parameters and no return value

This is the smallest useful function form. It performs an action but does not need input and does not return anything.

```swift
func showWelcome() {
    print("Welcome to Swift")
}
```

Here, `showWelcome` is the function name. The empty parentheses mean the function takes no parameters. Because there is no `->` return type, it returns no value.

### Calling the function

Defining a function creates it. Calling a function runs it.

```swift
func showWelcome() {
    print("Welcome to Swift")
}

showWelcome()
```

Output (tested with Swift 6.4):

```text
Welcome to Swift
```

The call uses the function name followed by parentheses. Because this function has no parameters, the parentheses stay empty.

### A function with parameters

Parameters let the function receive values from the caller.

```swift
func greet(name: String) {
    print("Hello, \(name)!")
}
```

This function expects one input named `name` of type `String`.

```swift
greet(name: "Ava")
```

Output (tested with Swift 6.4):

```text
Hello, Ava!
```

In Swift, function calls usually include argument labels such as `name:`. This makes calls read more clearly.

### A function with a return value

Some functions compute and return a result. In Swift, you declare the return type with `->`.

```swift
func square(number: Int) -> Int {
    return number * number
}
```

This function takes one integer and returns another integer.

```swift
let result = square(number: 6)
print(result)
```

Output (tested with Swift 6.4):

```text
36
```

The returned value can be stored in a variable or used directly in another expression.

## 4. Step-by-Step Examples

### Example 1: A simple function with no input

Start with a function that just performs one action. This helps you see the basic structure clearly.

```swift
func printDivider() {
    print("----------")
}

printDivider()
printDivider()
```

Output (tested with Swift 6.4):

```text
----------
----------
```

This function is useful when the same output is needed multiple times. Instead of repeating the same `print` statement, you define one reusable function.

### Example 2: A function with two parameters

Most useful functions accept input. Here is a function that calculates a total price from two values.

```swift
func calculateTotal(price: Double, tax: Double) -> Double {
    return price + tax
}

let total = calculateTotal(price: 19.99, tax: 1.60)
print(total)
```

Output (tested with Swift 6.4):

```text
21.59
```

The function definition lists both parameters with names and types. The call must provide both labeled arguments in the same order.

### Example 3: A function that returns a Boolean

Functions often answer yes-or-no questions. Returning `Bool` is common for validation and checks.

```swift
func isEven(number: Int) -> Bool {
    return number % 2 == 0
}

print(isEven(number: 8))
print(isEven(number: 5))
```

Output (tested with Swift 6.4):

```text
true
false
```

This function returns `true` for even numbers and `false` for odd numbers.

### Example 4: Using external argument labels

Swift lets you use one name inside the function and another label when calling it. This is useful when you want calls to read like natural language.

```swift
func multiply(_ firstNumber: Int, by secondNumber: Int) -> Int {
    return firstNumber * secondNumber
}

let product = multiply(4, by: 3)
print(product)
```

Output (tested with Swift 6.4):

```text
12
```

The underscore `_` removes the external label for the first parameter, while `by` becomes the label used at the call site. Inside the function body, the local names are `firstNumber` and `secondNumber`.

## 5. Practical Use Cases

Defining functions is useful in nearly every Swift program. Here are concrete situations where they help:

- Formatting user input, such as trimming or normalizing names before display.
- Calculating totals, discounts, taxes, or scores from multiple values.
- Validating data, such as checking whether a password length is acceptable.
- Converting values between units, such as kilometers to miles or Celsius to Fahrenheit.
- Breaking a long program into smaller named steps like `loadData()`, `sortItems()`, and `printReport()`.
- Reusing the same logic in different parts of a command-line app or playground.

In practice, a well-named function often acts like a sentence in your code. That makes larger programs much easier to read.

## 6. Common Mistakes

### Mistake 1: Forgetting an argument label in the function call

Swift function calls usually require the external parameter labels exactly as defined. Beginners often write calls as if Swift automatically accepts unlabeled values.

**Problem:** This call is missing the required argument label, so Swift reports an error such as `Missing argument label 'name:' in call`.

```swift
func greet(name: String) {
    print("Hello, \(name)!")
}

greet("Mia")
```

**Fix:** Use the required argument label in the call, or explicitly remove the external label in the function definition if that is what you want.

```swift
func greet(name: String) {
    print("Hello, \(name)!")
}

greet(name: "Mia")
```

Output (tested with Swift 6.4):

```text
Hello, Mia!
```

The corrected version works because the function call matches the parameter label defined by the function signature.

### Mistake 2: Declaring a return type but not returning a value

If a function says it returns a value, every valid path through the function must actually return one.

**Problem:** This function declares that it returns an `Int`, but it never provides one, so Swift reports an error such as `Missing return in global function expected to return 'Int'`.

```swift
func doubleNumber(number: Int) -> Int {
    number * 2
}
```

**Fix:** Return the computed value explicitly.

```swift
func doubleNumber(number: Int) -> Int {
    return number * 2
}
```

The corrected version works because the function now returns the value its signature promises.

### Mistake 3: Trying to use a return value from a function that returns nothing

Not every function produces a value. A function without a return type only performs an action.

**Problem:** This code tries to store the result of a function that returns no value, which leads to confusing type errors or unusable results.

```swift
func sayHello() {
    print("Hello")
}

let message = sayHello()
```

Output (tested with Swift 6.4):

```text
Hello
```

**Fix:** Either call the function for its side effect only, or change the function so it returns a value.

```swift
func sayHello() {
    print("Hello")
}

sayHello()

func helloMessage() -> String {
    return "Hello"
}

let message = helloMessage()
```

Output (tested with Swift 6.4):

```text
Hello
```

The corrected version works because each function is used according to whether it returns a value.

### Mistake 4: Passing the wrong number of arguments

Swift checks function signatures strictly. If a function expects two arguments, the call must provide exactly two.

**Problem:** This call does not match the function signature, so Swift reports an error such as `Missing argument for parameter` or `Extra argument in call`.

```swift
func add(a: Int, b: Int) -> Int {
    return a + b
}

let sum = add(a: 5)
```

**Fix:** Pass every required argument exactly once, using the correct labels.

```swift
func add(a: Int, b: Int) -> Int {
    return a + b
}

let sum = add(a: 5, b: 7)
```

The corrected version works because the function call now matches the full parameter list.

## 7. Best Practices

### Practice 1: Give functions names that describe an action

A function name should make the code readable at the call site. Vague names force readers to inspect the body to understand what the function does.

```swift
// Less clear
func process(value: Double) -> Double {
    return value * 0.9
}

// Preferred
func applyDiscount(to price: Double) -> Double {
    return price * 0.9
}
```

The preferred version communicates intent more clearly and makes the call easier to understand.

### Practice 2: Keep each function focused on one job

Functions are easier to reuse and test when they do one thing well. If one function reads input, calculates data, formats text, and prints output, it becomes hard to change later.

```swift
// Less preferred: too many responsibilities
func handleOrder() {
    let price = 24.0
    let tax = 2.4
    let total = price + tax
    print("Total: \(total)")
}

// Preferred: focused responsibilities
func calculateOrderTotal(price: Double, tax: Double) -> Double {
    return price + tax
}

func printOrderTotal(amount: Double) {
    print("Total: \(amount)")
}
```

This separation makes each function simpler and more reusable.

### Practice 3: Use argument labels to improve readability

Good labels make function calls read naturally. They show what each value means without requiring the reader to inspect the function body.

```swift
// Less descriptive
func move(x: Int, y: Int) {
    print("Move to \(x), \(y)")
}

// Preferred
func move(toX x: Int, y: Int) {
    print("Move to \(x), \(y)")
}

move(toX: 10, y: 20)
```

Output (tested with Swift 6.4):

```text
Move to 10, 20
```

Readable argument labels reduce confusion and make incorrect calls less likely.

## 8. Limitations and Edge Cases

- Swift does not let function calls ignore required labels unless the function definition explicitly removes them with `_`.
- If a function declares a return type, every path must return a value of that exact type.
- Functions can be overloaded in Swift, but beginners may find overloads confusing if multiple functions share the same name with different parameter lists.
- A function that returns nothing is often described as returning `Void`, which is effectively an empty tuple type. In everyday Swift code, you usually just omit the return type.
- Very long parameter lists make function calls hard to read and are often a sign that the function should be redesigned.
- If a function seems "not working," the issue is often a mismatched label, missing parameter, incorrect return type, or simply forgetting to call the function after defining it.

> A common beginner confusion is defining a function and expecting it to run automatically. In Swift, a function definition only creates the function. Nothing happens until you call it.

## 9. Practical Mini Project

Let’s build a small console-style example that uses several functions together. This program calculates a final score, checks whether the user passed, and prints a report. It shows how separate function definitions can work together cleanly.

```swift
func calculateAverage(firstScore: Double, secondScore: Double, thirdScore: Double) -> Double {
    return (firstScore + secondScore + thirdScore) / 3
}

func didPass(average: Double) -> Bool {
    return average >= 60
}

func printReport(for studentName: String, average: Double, passed: Bool) {
    print("Student: \(studentName)")
    print("Average: \(average)")
    print("Passed: \(passed)")
}

let average = calculateAverage(firstScore: 72, secondScore: 85, thirdScore: 91)
let passed = didPass(average: average)
printReport(for: "Lena", average: average, passed: passed)
```

Output (tested with Swift 6.4):

```text
Student: Lena
Average: 82.66666666666667
Passed: true
```

This example uses three clearly defined functions. One calculates a value, one checks a condition, and one prints the final result. That separation makes the program easier to read and easier to extend later.

## 10. Key Points

- Use the `func` keyword to define a function in Swift.
- Parameters let a function receive input values.
- Return types let a function send a result back to the caller.
- Swift function calls usually require argument labels.
- Functions should have clear names and focused responsibilities.
- Common errors include missing labels, missing return statements, and mismatched argument counts.
- Defining a function does not run it; you must call it explicitly.

## 11. Practice Exercise

Create a function named `calculateArea` that takes two parameters, `width` and `height`, both of type `Double`. The function should return the rectangle area. Then call the function and print the result.

- Use a return type of `Double`.
- Pass both arguments with labels.
- Store the returned value in a constant.
- Print a readable message that includes the area.

**Expected output:** A line showing the calculated area, such as `Area: 50.0`.

**Hint:** Multiply the width by the height and return that value from the function.

```swift
func calculateArea(width: Double, height: Double) -> Double {
    return width * height
}

let area = calculateArea(width: 10.0, height: 5.0)
print("Area: \(area)")
```

Output (tested with Swift 6.4):

```text
Area: 50.0
```

## 12. Final Summary

Defining functions in Swift is how you turn repeated or meaningful logic into reusable, named units of code. You learned the core syntax for functions with no parameters, functions with parameters, and functions that return values. You also saw how argument labels affect function calls and why Swift enforces those labels carefully.

Just as important, you saw the most common mistakes: missing labels, missing return statements, and calling functions with the wrong arguments. If you practice writing small functions with clear names and one focused responsibility, your Swift code will become easier to read and easier to maintain.

A strong next step is to learn about function parameter labels in more depth, followed by default parameter values, inout parameters, and function overloading. Those topics build directly on the basics of defining functions.
