History
Development of Swift started in July 2010 byconsume
operator. Swift 5.10, released in March 2024, improves the language's concurrency model, allowing for full data isolation to prevent data races.
Swift 6 was released in September 2024. Swift 6.1 was released in March 2025. It includes "new language enhancements to improve productivity, diagnostics improvements, package traits, and ongoing work to improve data-race safety usability and compile times."
Swift won first place for ''Most Loved Programming Language'' in the Platforms
The platforms Swift supports are Apple's operating systems ( Darwin, iOS, iPadOS,Version history
Features
Swift is a general purpose programming language that employs modern programming-language theory concepts and strives to present a simple, yet powerful syntax. Swift incorporates innovations and conventions from various programming languages, with notable inspiration from Objective-C, which it replaced as the primary development language on Apple Platforms. Swift was designed to be safe and friendly to new programmers while not sacrificing speed. By default Swift manages all memory automatically and ensures variables are always initialized before use. Array accesses are checked for out-of-bounds errors and integer operations are checked for overflow. Parameter names allow creating clear APIs. Protocols define interfaces that types may adopt, while extensions allow developers to add more function to existing types. Swift enablesBasic syntax
Swift's
keyword. Function parameters may have names which allow function calls to read like phrases. An underscore before the parameter name allows the argument label to be omitted from the call site.
statements require that the given condition is true before continuing on past the
statement, otherwise the body of the provided
clause is run. The
clause must exit control of the code block in which the
statement appears.
statements are useful for ensuring that certain requirements are met before continuing on with program execution. In particular they can be used to create an unwrapped version of an optional value that is guaranteed to be non-nil for the remainder of the enclosing scope. switch
statements compare a value with multiple potential values and then executes an associated code block. switch
statements must be made exhaustive, either by including cases for all possible values or by including a default
case which is run when the provided value doesn't match any of the other cases. switch
cases do not implicitly fall through, although they may explicitly do so with the fallthrough
keyword. Pattern matching can be used in various ways inside switch
statements. Here is an example of an integer being matched against a number of potential ranges:for-in
loops iterate over a sequence of values: while
loops iterate as long as the given Boolean condition evaluates to true
:Closure support
Swift supports closures, which are self-contained blocks of functionality that can be passed around and used in code, and can also be used as anonymous functions. Here are some examples:String support
The Swift standard library includes unicode-compliant and types. String values can be initialized with a String literal, a sequence of characters surrounded by double quotation marks. Strings can be concatenated with the operator:Callable objects
Access control
Swift supports fiveOptionals and chaining
An important feature in Swift is option types, which allowOptional
enum. To make an Integer that is nullable, one would use a declaration similar to var optionalInteger: Optional<Int>
. As in C#, Swift also includes syntactic sugar for this, allowing one to indicate a variable is optional by placing a question mark after the type name, var optionalInteger: Int?
. Variables or constants that are marked optional either have a value of the underlying type or are nil
. Optional types ''wrap'' the base type, resulting in a different instance. String
and String?
are fundamentally different types, the former is of type String
while the latter is an Optional
that may be holding some String
value.
To access the value inside, assuming it is not nil, it must be ''unwrapped'' to expose the instance inside. This is performed with the !
operator:
!
operator unwraps anOptionalInstance
to expose the instance inside, allowing the method call to be made on it. If anOptionalInstance
is nil, a null-pointer error occurs, terminating the program. This is known as force unwrapping. Optionals may be safely unwrapped using optional chaining which first tests whether the instance is nil, and then unwrap it if it is non-null:
someMethod
only if anOptionalInstance
is not nil, suppressing the error. A ?
must be placed after every optional property. If any of these properties are nil the entire expression evaluates as nil. The origin of the term ''chaining'' comes from the more common case where several method calls/getters are chained together. For instance:
Value types
In many object-oriented languages, objects are represented internally in two parts. The object is stored as a block of data placed on the heap, while the name (or "handle") to that object is represented by a pointer. Objects are passed between methods by copying the value of the pointer, allowing the same underlying data on the heap to be accessed by anyone with a copy. In contrast, basic types like integers and floating-point values are represented directly; the handle contains the data, not a pointer to it, and that data is passed directly to methods by copying. These styles of access are termed ''pass-by-reference'' in the case of objects, and ''pass-by-value'' for basic types. Both concepts have their advantages and disadvantages. Objects are useful when the data is large, like the description of a window or the contents of a document. In these cases, access to that data is provided by copying a 32- or 64-bit value, versus copying an entire data structure. However, smaller values like integers are the same size as pointers (typically both are oneclass
declaration and the latter using struct
. Structs in Swift have almost all the same features as classes: methods, implementing protocols and using the extension mechanisms. For this reason, Apple terms all data generically as ''instances'', versus objects or values. Structs do not support inheritance, however.
The programmer is free to choose which semantics are more appropriate for each data structure in the application. Larger structures like windows would be defined as classes, allowing them to be passed around as pointers. Smaller structures, like a 2D point, can be defined as structs, which will be pass-by-value and allow direct access to their internal data with no indirection or reference counting. The performance improvement inherent to the pass-by-value concept is such that Swift uses these types for almost all common data types, including Int
and Double
, and types normally represented by objects, like String
and Array
. Using value types can result in significant performance improvements in user applications as well.
Array
, Dictionary
, and Set
all utilize copy on write so that their data are copied only if and when the program attempts to change a value in them. This means that the various accessors have what is in effect a pointer to the same data storage. So while the data is physically stored as one instance in memory, at the level of the application, these values are separate and physical separation is enforced by copy on write only if needed.
Extensions
Extensions add new functionality to an existing type, without the need to subclass or even have access to the original source code. Extensions can add new methods, initializers, computed properties, subscripts, and protocol conformances. An example might be to add a spell checker to the baseString
type, which means all instances of String
in the program gain the ability to spell-check. The system is also widely used as an organizational technique, allowing related code to be gathered into library-like extensions.
Extensions are declared with the extension
keyword.Protocol-oriented programming
Protocols promise that a particular type implements a set of methods or properties, meaning that other instances in the system can call those methods on any instance implementing that protocol. This is often used in modern object-oriented languages as a substitute for multiple inheritance, although the feature sets are not entirely similar. In Objective-C, and most other languages implementing the protocol concept, it is up to the programmer to ensure that the required methods are implemented in each class. Swift adds the ability to add these methods using extensions, and to use generic programming (generics) to implement them. Combined, these allow protocols to be written once and support a wide variety of instances. Also, the extension mechanism can be used to add protocol conformance to an object that does not list that protocol in its definition. For example, a protocol might be declared calledPrintable
, which ensures that instances that conform to the protocol implement a description
property and a printDetails()
method requirement:
someSortOfPrintableInstance
is, the compiler will ensure that it conforms to the protocol and thus this code is safe. This syntax also means that collections can be based on protocols also, like let printableArray = ny Printable/code>.
Both extensions and protocols are used extensively in Swift's standard library; in Swift 5.9, approximately 1.2 percent of all symbols within the standard library were protocols, and another 12.3 percent were protocol requirements or default implementations. For instance, Swift uses extensions to add the Equatable
protocol to many of their basic types, like Strings and Arrays, allowing them to be compared with the
operator. The Equatable
protocol also defines this default implementation:
func !=(lhs: T, rhs: T) -> Bool
This function defines a method that works on any instance conforming to Equatable
, providing a ''not equals'' operator. Any instance, class or struct, automatically gains this implementation simply by conforming to Equatable
.
Protocols, extensions, and generics can be combined to create sophisticated APIs. For example, constraints allow types to conditionally adopt protocols or methods based on the characteristics of the adopting type. A common use case may be adding a method on collection types only when the elements contained within the collection are Equatable
:
extension Array where Element: Equatable
Concurrency
Swift 5.5 introduced structured concurrency into the language. Structured concurrency uses Async/await syntax similar to Kotlin, JavaScript, and Rust. An async function is defined with the async
keyword after the parameter list. When calling an async function the await
keyword must be written before the function to indicate that execution will potentially suspend while calling function. While a function is suspended the program may run some other concurrent function in the same program. This syntax allows programs to clearly call out potential suspension points and avoid a version of the Pyramid of Doom caused by the previously widespread use of closure callbacks.
func downloadText(name: String) async -> String
let text = await downloadText("text1")
The async let
syntax allows multiple functions to run in parallel. await
is again used to mark the point at which the program will suspend to wait for the completion of the async
functions called earlier.
// Each of these calls to downloadText will run in parallel.
async let text1 = downloadText(name: "text1")
async let text2 = downloadText(name: "text2")
async let text3 = downloadText(name: "text3")
let textToPrint = await ext1, text2, text3// Suspends until all three downloadText calls have returned.
print(textToPrint)
Tasks and TaskGroups can be created explicitly to create a dynamic number of child tasks during runtime:
let taskHandle = Task
let result = await taskHandle.value
Swift uses the Actor model
The actor model in computer science is a mathematical model of concurrent computation that treats an ''actor'' as the basic building block of concurrent computation. In response to a message it receives, an actor can: make local decisions, create ...
to isolate mutable state, allowing different tasks to mutate shared state in a safe manner. Actors are declared with the actor
keyword and are reference types, like classes. Only one task may access the mutable state of an actor at the same time. Actors may access and mutate their own internal state freely, but code running in separate tasks must mark each access with the await
keyword to indicate that the code may suspend until other tasks finish accessing the actor's state.
actor Directory
let directory = Directory()
// Code suspends until other tasks finish accessing the actor.
await directory.add(name: "Tucker")
print(await directory.names)
Libraries, runtime, development
On Apple systems, Swift uses the same runtime as the extant Objective-C
Objective-C is a high-level general-purpose, object-oriented programming language that adds Smalltalk-style message passing (messaging) to the C programming language. Originally developed by Brad Cox and Tom Love in the early 1980s, it was ...
system, but requires iOS 7 or macOS 10.9 or higher. It also depends on Grand Central Dispatch. Swift and Objective-C code can be used in one program, and by extension, C and C++ also. Beginning in Swift 5.9, C++ code can be used directly from Swift code. In the case of Objective-C, Swift has considerable access to the object model, and can be used to subclass, extend and use Objective-C code to provide protocol support. The converse is not true: a Swift class cannot be subclassed in Objective-C.
To aid development of such programs, and the re-use of extant code, Xcode 6 and higher offers a semi-automated system that builds and maintains a ''bridging header'' to expose Objective-C code to Swift. This takes the form of an additional header file that simply defines or imports all of the Objective-C symbols that are needed by the project's Swift code. At that point, Swift can refer to the types, functions, and variables declared in those imports as though they were written in Swift. Objective-C code can also use Swift code directly, by importing an automatically maintained header file with Objective-C declarations of the project's Swift symbols. For instance, an Objective-C file in a mixed project called "MyApp" could access Swift classes or functions with the code #import "MyApp-Swift.h"
. Not all symbols are available through this mechanism, however—use of Swift-specific features like generic types, non-object optional types, sophisticated enums, or even Unicode identifiers may render a symbol inaccessible from Objective-C.
Swift also has limited support for ''attributes'', metadata that is read by the development environment, and is not necessarily part of the compiled code. Like Objective-C, attributes use the @
syntax, but the currently available set is small. One example is the @IBOutlet
attribute, which marks a given value in the code as an ''outlet'', available for use within Interface Builder (IB). An ''outlet'' is a device that binds the value of the on-screen display to an object in code.
On non-Apple systems, Swift does not depend on an Objective-C runtime or other Apple system libraries; a set of Swift "Corelib" implementations replace them. These include a "swift-corelibs-foundation" to stand in for the Foundation Kit, a "swift-corelibs-libdispatch" to stand in for the Grand Central Dispatch, and an "swift-corelibs-xctest" to stand in for the XCTest APIs from Xcode
Xcode is a suite of developer tools for building apps on Apple devices. It includes an integrated development environment (IDE) of the same name for macOS, used to develop software for macOS, iOS, iPadOS, watchOS, tvOS, and visionOS. It w ...
.
As of 2019, with Xcode 11, Apple has also added a major new UI paradigm called SwiftUI. SwiftUI replaces the older Interface Builder paradigm with a new declarative development paradigm.
Memory management
Swift uses Automatic Reference Counting
Automatic Reference Counting (ARC) is a memory management feature of the Clang compiler providing automatic reference counting for the Objective-C and Swift (programming language), Swift programming languages. At compile time, it inserts into the o ...
(ARC) to manage memory. Every instance of a class or closure maintains a reference count which keeps a running tally of the number of references the program is holding on to. When this count reaches 0 the instance is deallocated. This automatic deallocation removes the need for a garbage collector as instances are deallocated as soon as they are no longer needed.
A '' strong reference cycle'' can occur if two instances each strongly reference each other (e.g. A references B, B references A). Since neither instances reference count can ever reach zero neither is ever deallocated, resulting in a memory leak. Swift provides the keywords weak
and unowned
to prevent strong reference cycles. These keywords allow an instance to be referenced without incrementing its reference count. weak
references must be optional variables, since they can change and become nil
. Attempting to access an unowned
value that has already been deallocated results in a runtime error.
A closure within a class can also create a strong reference cycle by capturing self references. Self references to be treated as weak or unowned can be indicated using a ''capture list.''
class Person
class Home
var stacy: Person? = Person(name: "Stacy")
var house21b: Home? = Home(address: "21b Baker Street", owner: stacy)
stacy?.home = house21b // stacy and house42b now refer to each other.
stacy = nil // The reference count for stacy is now 1, because house21b is still holding a reference to it.
house21b = nil // house21b's reference count drops to 0, which in turn drops stacy's count to 0 because house21b was the last instance holding a strong reference to stacy.
// Prints:
// De-initialized 21b Baker Street
// De-initialized Stacy
Debugging
A key element of the Swift system is its ability to be cleanly debugged and run within the development environment, using a read–eval–print loop
A read–eval–print loop (REPL), also termed an interactive toplevel or language shell, is a simple interactive computer programming environment that takes single user inputs, executes them, and returns the result to the user; a program written ...
(REPL), giving it interactive properties more in common with the scripting abilities of Python than traditional system programming languages. The REPL is further enhanced with playgrounds
A playground, playpark, or play area is a place designed to provide an environment for children that facilitates Play (activity)#Children, play, typically outdoors. While a playground is usually designed for children, some are designed for othe ...
, interactive views running within the Xcode environment or Playgrounds
A playground, playpark, or play area is a place designed to provide an environment for children that facilitates Play (activity)#Children, play, typically outdoors. While a playground is usually designed for children, some are designed for othe ...
app that respond to code or debugger changes on-the-fly. Playgrounds allow programmers to add in Swift code along with markdown documentation. Programmers can step through code and add breakpoints using LLDB either in a console or an IDE like Xcode.
Comparisons to other languages
Swift is considered a C family programming language and is similar to C in various ways:
* Most operators in C also appear in Swift, although some operators such as +
have slightly different behavior. For example, in Swift, +
traps on overflow, whereas &+
is used to denote the C-like behavior of wrapping on overflow.
* Curly braces are used to group statements.
* Variables are assigned using an equals sign
The equals sign (British English) or equal sign (American English), also known as the equality sign, is the mathematical symbol , which is used to indicate equality. In an equation it is placed between two expressions that have the same valu ...
, but compared using ">two consecutive equals signs. A new identity operator,
, is provided to check if two data elements refer to the same object.
* Control statements while
, if
, and switch
are similar, but have extended functions, e.g., a switch
that takes non-integer cases, while
and if
supporting pattern matching and conditionally unwrapping optionals, for
uses the syntax.
* Square brackets are used with arrays
An array is a systematic arrangement of similar objects, usually in rows and columns.
Things called an array include:
{{TOC right
Music
* In twelve-tone and serial composition, the presentation of simultaneous twelve-tone sets such that the ...
, both to declare them and to get a value at a given index in one of them.
It also has similarities to Objective-C:
* Basic numeric types: Int, UInt, Float, Double
* Class methods are inherited, like instance methods; self
in class methods is the class the method was called on.
* Similar for
...in
enumeration syntax.
Differences from Objective-C include:
* Statements need not end with semicolons (;
), though these must be used to allow more than one statement on one line.
* No header files.
* Uses type inference.
* Generic programming.
* Functions are first-class objects.
* Enumeration cases can have associated data ( algebraic data types).
* Operators can be redefined for classes ( operator overloading), and new operators can be defined.
* Strings fully support Unicode
Unicode or ''The Unicode Standard'' or TUS is a character encoding standard maintained by the Unicode Consortium designed to support the use of text in all of the world's writing systems that can be digitized. Version 16.0 defines 154,998 Char ...
. Most Unicode characters can be used in either identifiers or operators.
* No exception handling. Swift 2 introduces a different and incompatible error-handling model.
* Several features of earlier C-family languages that are easy to misuse have been removed:
** Pointers are not exposed by default. There is no need for the programmer to keep track of and mark names for referencing or dereferencing.
** Assignments return no value. This prevents the common error of writing i = 0
instead of i 0
(which throws a compile-time error).
** No need to use break
statements in switch
blocks. Individual cases do not fall through to the next case unless the fallthrough
statement is used.
** Variables and constants are always initialized and array bounds are always checked.
** Integer overflows, which result in undefined behavior for signed integers in C, are trapped as a run-time error in Swift. Programmers can choose to allow overflows by using the special arithmetical operators &+
, &-
, &*
, &/
and &%
. The properties min
and max
are defined in Swift for all integer types and can be used to safely check for potential overflows, versus relying on constants defined for each type in external libraries.
** The one-statement form of if
and while
, which allows for the omission of braces around the statement, is unsupported.
** C-style enumeration for (int i = 0; i < c; i++)
, which is prone to off-by-one errors, is unsupported (from Swift 3 onward).
** The pre- and post- increment and decrement operators (i++
, --i
...) are unsupported (from Swift 3 onward), more so since C-style for
statements are also unsupported from Swift 3 onward.
Development and other implementations
Because Swift can run on Linux, it is sometimes also used as a server-side language. Some web frameworks have been developed, such as IBM
International Business Machines Corporation (using the trademark IBM), nicknamed Big Blue, is an American Multinational corporation, multinational technology company headquartered in Armonk, New York, and present in over 175 countries. It is ...
's Kitura (now discontinued), Perfect, Vapor
In physics, a vapor (American English) or vapour (Commonwealth English; American and British English spelling differences#-our, -or, see spelling differences) is a substance in the gas phase at a temperature lower than its critical temperature,R ...
, an
Hummingbird
An official "Server APIs" work group has also been started by Apple, with members of the Swift developer community playing a central role.
A second free implementation of Swift that targets Cocoa, Microsoft
Microsoft Corporation is an American multinational corporation and technology company, technology conglomerate headquartered in Redmond, Washington. Founded in 1975, the company became influential in the History of personal computers#The ear ...
's Common Language Infrastructure
The Common Language Infrastructure (CLI) is an open specification and technical standard originally developed by Microsoft and standardized by International Organization for Standardization, ISO/International Electrotechnical Commission, IEC (ISO/ ...
( .NET Framework, now .NET
The .NET platform (pronounced as "''dot net"'') is a free and open-source, managed code, managed computer software framework for Microsoft Windows, Windows, Linux, and macOS operating systems. The project is mainly developed by Microsoft emplo ...
), and the Java
Java is one of the Greater Sunda Islands in Indonesia. It is bordered by the Indian Ocean to the south and the Java Sea (a part of Pacific Ocean) to the north. With a population of 156.9 million people (including Madura) in mid 2024, proje ...
and Android platform exists as part of the ''Elements Compiler'' from RemObjects Software.
Subsets of Swift have been ported to additional platforms, such as Arduino
Arduino () is an Italian open-source hardware and open-source software, software company, project, and user community that designs and manufactures single-board microcontrollers and microcontroller kits for building digital devices. Its hardwar ...
and Mac OS 9.
See also
* Comparison of programming languages
* Objective-C
Objective-C is a high-level general-purpose, object-oriented programming language that adds Smalltalk-style message passing (messaging) to the C programming language. Originally developed by Brad Cox and Tom Love in the early 1980s, it was ...
* D (programming language)
D, also known as dlang, is a multi-paradigm system programming language created by Walter Bright at Digital Mars and released in 2001. Andrei Alexandrescu joined the design and development effort in 2007. Though it originated as a re-engin ...
* Kotlin (programming language)
* Nim (programming language)
* Python (programming language)
Python is a high-level programming language, high-level, general-purpose programming language. Its design philosophy emphasizes code readability with the use of significant indentation.
Python is type system#DYNAMIC, dynamically type-checked a ...
* Realm (database)
References
External links
*
Swift
at Apple Developer
*
{{Authority control
Swift (programming language)
Apple Inc. software
Programming languages
High-level programming languages
Declarative programming languages
Object-oriented programming languages
Functional languages
Pattern matching programming languages
Programming languages created in 2014
Statically typed programming languages
Systems programming languages
Cross-platform free software
Software using the Apache license
Articles with example Swift code