結論

Swiftは、Appleが作ったiPhone・Macアプリ向けのプログラミング言語です。無料のオープンソースで、国際送金のSWIFTとは別物です。

この記事でわかること

  • 基本文法18項目の早見表と、つまずく所の書き方
  • Kotlin・Java・Dartとの対応表16行と実行結果
  • Swiftのエラー原文12件の意味と直し方

2026年10月22日更新|Swift 6.4.1・Xcode 27.1 の公式情報で確認

Swift で書いたコードはコンパイラが機械語に変換し、iPhone・Mac のアプリにも、Linux や Windows のコマンド・サーバーにもなります。画面は SwiftUI という部品の仕組みで作ります。

flowchart TD
    S[Swift のコード<br>.swift ファイル] --> C[コンパイラ<br>Xcode・swift build]
    C --> A[iPhone・Mac などの<br>Apple のアプリ]
    C --> L[Linux・Windows の<br>コマンドやサーバー]
    U[SwiftUI<br>画面の部品] --> A

やりたいことごとに、使うものと書き方をまとめます。

やりたいこと 使うもの・書き方 補足
iPhone アプリを作る Mac+Xcode(無料)+SwiftUI Xcode 27.1 は macOS 26.6 以降
まず触ってみる Swift Playgrounds(iPad・Mac) 無料。日本語のレッスンあり
Windows・Linux で書く swift.org のツールチェーン+VS Code iPhone アプリは作れない
変数と定数 var と let let は再代入できない
値が無いかもしれない String? と if let・?? オプショナル(後の節)
画面を作る SwiftUI の struct 名前: View Xcode のプレビューで確認
App Store で配る Apple Developer Program 年99米ドル(2026年10月22日時点)

確認環境:Swift 6.4.1(2026年10月7日のタグ)・Xcode 27.1。Swift のコードと出力は、Swift 6.4 に対応した公式の本「The Swift Programming Language」(GitHub の swiftlang/swift-book、2026年9月の版)の例と、本に書かれた出力を使いました。記事の Swift のコードは、すべて tree-sitter-swift 0.7.4 で構文解析して、構文の誤りが無いことを確かめています。コンパイラのエラー文は、swift-book のテストに記録された出力と、Swift 6.4.1 のソース(診断メッセージの定義 DiagnosticsSema.def・DiagnosticsSIL.def、標準ライブラリ)で、swift package init の雛形は Swift Package Manager 6.4.1 のソースで確かめました。比較用の Kotlin 2.4.20・OpenJDK 21.0.10 のコードは Ubuntu 24.04 で実際にコンパイルして実行しています。Xcode と Swift Playgrounds の版・動作環境は Apple Developer と App Store、インストール手順は swift.org、SwiftUI は Apple Developer Documentation、言語の順位は TIOBE Index で確かめました(確認日 2026年10月22日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Swiftとは|プログラミング言語の特徴・基本文法・SwiftUI入門」

Swiftとは(プログラミング言語のSwift)

この節では、Swift がどんな言語で、同じ名前の別のものとどう見分けるかが分かります。

Swift(スウィフト)は、Apple が2014年に発表したプログラミング言語です。 iPhone・iPad・Mac・Apple Watch・Apple TV・Apple Vision Pro のアプリを作る標準の言語で、2015年からはオープンソース(Apache 2.0 ライセンス)として公開され、Linux と Windows でも使えます。英語の swift は「速い」という意味です。

公式の本「The Swift Programming Language」は、Swift を次のように紹介しています。

Swift is a fantastic way to write software for phones, tablets, desktops, servers, or anything else that runs code. It's a safe and fast programming language(スマホ・タブレット・デスクトップ・サーバーなど、コードが動くものすべてのソフトウェアを書ける。安全で速い言語である)

「SWIFT」と検索して出てくる別のものとの見分け方

「swift」で検索すると、プログラミング言語以外のものも混ざります。一緒に出てくる言葉で見分けます。

名前 何か 一緒に出てくる言葉
Swift(この記事) Apple が作ったプログラミング言語 Xcode・SwiftUI・iOS・アプリ開発
SWIFT(国際送金) 銀行どうしが送金の指示をやり取りする通信網を運営する組織 国際送金・SWIFT コード・BIC・銀行
SwiftUI Swift で画面を作るための Apple の仕組み View・@State・プレビュー
Swift Playgrounds Swift を学べる Apple のアプリ iPad・レッスン
OpenStack Swift OpenStack のオブジェクトストレージ クラウド・ストレージ

国際送金の SWIFT は、Society for Worldwide Interbank Financial Telecommunication(国際銀行間金融通信協会)の略で、大文字で書かれます。本部はベルギーにあり、1万1,000を超える金融機関を結ぶ協同組合です(SWIFT 公式サイトより)。プログラミング言語の Swift とは関係がありません。

Swiftの歴史と最新バージョン

この記事の確認日(2026年10月22日)時点の最新版は Swift 6.4.1 です(swift.org のインストールページ)。Xcode 27・27.1 には Swift 6.4 のコンパイラが入っています。

2014年

出来事
WWDC 2014 で発表。同じ年の9月に 1.0
要点
Objective-C に代わる Apple の新しい言語として登場

2015年

出来事
12月にオープンソース化(Apache 2.0)
要点
Linux でも使えるようになった

2019年

出来事
3月に Swift 5.0。ABI が安定
要点
Apple の OS に Swift の実行環境が入り、アプリにライブラリを同梱しなくてよくなった

2024〜2026年

出来事
2024年9月に Swift 6.0、2026年9月に 6.4、10月に 6.4.1
要点
データ競合をコンパイル時に見つける「Swift 6 言語モード」が入った

日付は swiftlang/swift リポジトリのリリースのタグ(swift-6.0-RELEASE は2024年9月11日、swift-6.4.0-RELEASE は2026年9月13日、swift-6.4.1-RELEASE は2026年10月7日のコミット)で確かめました。Swift は6.x の間、おおむね半年ごとに新しい版(6.1・6.2・6.3・6.4)が出ています。

Xcode の版 必要な macOS 入っている Swift 使える言語モード
Xcode 27.2 RC macOS Tahoe 26.6 以降 Swift 6.4 Swift 6・5・4.2・4
Xcode 27.1 macOS Tahoe 26.6 以降 Swift 6.4 Swift 6・5・4.2・4
Xcode 27 macOS Tahoe 26.6 以降 Swift 6.4 Swift 6・5・4.2・4

(Apple Developer「Xcode のサポート」の表。2026年10月22日時点)

言語モードは「どの版の Swift の決まりでコードを解釈するか」の設定です。Swift 6.4 のコンパイラで、Swift 5 の決まりで書いたコードもビルドできます。本の「Version Compatibility」には、Swift 6 で書いたモジュールと Swift 5 で書いたモジュールは互いに依存できるので、大きなプロジェクトは1つずつ移行できる、とあります。

Swiftの特徴(安全・速い・読みやすい)

この節では、Swift が何を大事にして作られた言語かが分かります。

公式の本は、Swift が「よくあるプログラムの誤りを、言語の仕組みで起きないようにしている」として、次の6つを挙げています。

1変数は使う前に必ず初期化される

値を入れていない変数を読むと、コンパイルの時点でエラーになります。

2配列の範囲外を検査する

存在しない番号を読むと、でたらめな値を返さずにその場で止まります。

3整数のあふれを検査する

型の最大値を超える計算は、黙って小さな値に戻らずにエラーになります。

4nil を明示して扱う(オプショナル)

「値が無いかもしれない」型を区別し、取り出す前の確認をコンパイラが求めます。

5メモリは自動で管理される

ARC(自動参照カウント)で、使われなくなったインスタンスを解放します。

6エラー処理で失敗から回復できる

失敗しうる関数に throws を付け、呼ぶ側に try と対処を求めます。

ほかの特徴です。

特徴 内容
静的型付け+型推論 型はコンパイル時に決まる。let x = 70 のように型を書かなくても推論される
コンパイル言語 機械語に変換してから動く。本は「コンパイラは性能のために最適化されている」と説明
値型を中心にした設計 文字列・配列・辞書も構造体(値型)。代入するとコピーとして振る舞う
プロトコル Java・Kotlin のインターフェースに近い。構造体・列挙型にも付けられる
並行処理 async/await・アクター。Swift 6 言語モードではデータ競合の多くをコンパイル時にエラーにする
セミコロン不要 文の終わりの ; は要らない(1行に複数の文を書くときだけ要る)
main() 不要 ファイルの一番外側に書いたコードから実行が始まる

Apple の Swift の紹介ページには、2014年10月に Apple が行った試験(1万個の整数をグラフから深さ優先探索で探す処理)で、Objective-C の最大2.6倍、Python 2.7 の最大8.4倍速かった、という数値が載っています。2014年の Mac と、その時点の Swift・Python での測定です。

Objective-Cとの違い

Swift の前に Apple のアプリで使われていたのは Objective-C です。今も古くからあるアプリや Apple のフレームワークの一部で使われていて、Swift と同じプロジェクトに混ぜられます。

項目 Swift Objective-C
登場 2014年(Apple) 1980年代。C 言語にオブジェクト指向を足した言語
ファイル .swift の1種類 ヘッダー .h と実装 .m の2つ
メソッドの呼び方 obj.doSomething() [obj doSomething];
文の終わり ; は要らない ; が要る
nil の扱い オプショナル型でだけ nil を持てる。取り出す前に確認が要る nil にメッセージを送っても何も起きず、0 や nil が返る
混ぜて使う Objective-C のヘッダーを「ブリッジングヘッダー」で読み込む Swift のコードは自動生成のヘッダー「モジュール名-Swift.h」で読み込む

Objective-C の nil の振る舞いは、Apple の「Programming with Objective-C」に「nil にメッセージを送ってもまったく問題なく、何も起きない」「戻り値はオブジェクトなら nil、数値なら 0」とあります。エラーにならないぶん、値が無いことに気づきにくくなります。Swift のオプショナルは、この「気づかないまま進む」をコンパイルの時点で止める仕組みです。

Apple の「Importing Objective-C into Swift」によると、Swift のアプリに Objective-C のファイルを足すと、Xcode が「モジュール名-Bridging-Header.h」という名前のブリッジングヘッダーを作るよう提案します。そこに #import したヘッダーの中身は、どの Swift ファイルからも import 文なしで使えます。

Swiftでできること・作れるもの

この節では、Swift で何が作れて、どの OS で動くかが分かります。

作れるもの 動く場所 主に使うもの
iPhone・iPad アプリ iOS・iPadOS Xcode・SwiftUI・UIKit
Mac アプリ macOS Xcode・SwiftUI・AppKit
Apple Watch・Apple TV・Vision Pro のアプリ watchOS・tvOS・visionOS Xcode・SwiftUI
コマンドラインのツール macOS・Linux・Windows Swift Package Manager
Web の API・サーバー Linux など Vapor・Hummingbird などのフレームワーク
WebAssembly・Android 向けのコード ブラウザ・Android swift.org が配る Swift SDK

swift.org のインストールページには、通常のツールチェーンのほかに、Static Linux(依存の少ない Linux 用の実行ファイル)・WebAssembly・Android 向けの「Swift SDK」が並んでいます。ただし、iPhone・Mac のアプリを作るための Apple のフレームワーク(SwiftUI・UIKit など)とシミュレータは、Mac の Xcode にしかありません。 Windows や Linux で書けるのは、画面を持たないプログラムやサーバーが中心です。

Apple の紹介ページには、Swift で作られたアプリとして LinkedIn・Duolingo・Strava・Khan Academy・Kickstarter などが挙がっています。TIOBE Index(2026年10月)では、Swift は14位(1.03%)でした。同じ表で Objective-C は25位、Dart は27位、Kotlin は32位です。

Swiftの開発環境(Xcode・Swift Playgrounds・Windows・Linux)

この節では、手元の機器ごとに何を入れればよいかと、その入れ方が分かります。

手元の機器 使うもの できること 料金
Mac(Apple M1 以降) Xcode 27.1 iPhone・Mac アプリの開発、シミュレータ、プレビュー 無料
iPad・Mac Swift Playgrounds 4.7 レッスンで学ぶ。簡単なアプリを作って App Store Connect に提出 無料
Windows swift.org のツールチェーン(winget)+VS Code コマンド・ライブラリ・サーバー 無料
Linux swiftly でツールチェーンを入れる+VS Code コマンド・サーバー 無料

(版・動作環境は App Store と swift.org の2026年10月22日時点の表示)

Mac:Xcodeを入れる

Mac App Store の Xcode のページでは、版は 27.1、サイズは 3.1GB、互換性は「macOS 26.6以降と、Apple M1以降のチップを搭載したMac」です。Intel の Mac では Xcode 27 は入りません。

1

Mac App Store で Xcode を入れる

「Xcode」を検索して入手します。Apple Developer のサイトからはベータ版も取れます。

3.1GB。macOS 26.6 以降

2

開発したいプラットフォームを入れる

初回起動時に表示される画面か、Xcode > Settings の Components で、iOS などのプラットフォームとシミュレータを「Get」で入れます。

ターミナルなら xcodebuild -downloadPlatform iOS

3

新しいプロジェクトを作る

Welcome to Xcode の画面で New Project から App を選ぶか、File > New > Project を選びます。テンプレートでは Interface に SwiftUI、Language に Swift を選びます。

Product Name がアプリの名前になる

4

シミュレータで動かす

ツールバーで実行先(iPhone の機種)を選び、Run ボタンを押します。Mac のアプリなら My Mac を選びます。

自分の iPhone で動かすときは Apple アカウントでサインイン

手順は Apple Developer Documentation の「Creating an Xcode project for an app」と「Downloading and installing additional Xcode components」に沿っています。Apple のドキュメントによると、今の Xcode では Swift ファイルの中に #Playground { ... } と書くと、その部分を実行した結果がキャンバスに表示されます(ファイルの先頭で import Playgrounds を書く)。Hello World や文法の確かめに使えます。

iPad・Mac:Swift Playgroundsで学ぶ

Swift Playgrounds は、Swift をレッスン形式で学べる Apple の無料アプリです。App Store の表示では、版は 4.7、iPad 版は iPadOS 18.0 以降が必要で、日本語に対応しています。Apple の紹介ページによると、20以上のテンプレートからアプリを作り、Xcode とプロジェクトを行き来したり、App Store Connect へ直接提出したりできます。

Windows・Linux:swift.orgのツールチェーンを入れる

swift.org の手順です。Windows では、先に Visual Studio 2022 Community と必要な部品を winget で入れ、そのあと Swift を入れます。

winget install --id Microsoft.VisualStudio.2022.Community --exact --force --custom "--add Microsoft.VisualStudio.Component.Windows11SDK.22621 --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 --add Microsoft.VisualStudio.Component.VC.Tools.ARM64" --source winget
winget install --id Swift.Toolchain -e --source winget

Linux(と Mac のコマンドライン)では、版の管理ツール swiftly で入れます。Linux の bash の場合です。

curl -O https://download.swift.org/swiftly/linux/swiftly-$(uname -m).tar.gz && \
tar zxf swiftly-$(uname -m).tar.gz && \
./swiftly init --quiet-shell-followup && \
. "${SWIFTLY_HOME_DIR:-$HOME/.local/share/swiftly}/env.sh" && \
hash -r

エディターは VS Code が使えます。swift.org の「Getting Started with Swift in VS Code」では、拡張機能 Swift(ID は swiftlang.swift-vscode)が、SourceKit-LSP による補完・定義へ移動・診断、LLDB によるデバッグ、XCTest と Swift Testing のテストの実行に対応しています。拡張機能は入っているツールチェーンを自動で見つけます。

Hello Worldを動かす(swift package init)

Swift の最初のプログラムは1行です。

print("Hello, world!")
// 出力: Hello, world!

本の Guided Tour には、ファイルの一番外側に書いたコードがプログラムの入口になるので main() 関数は要らない、文の終わりの ; も要らない、とあります。

ターミナルでは、Swift Package Manager でプロジェクトを作ります。swift.org の「Build a Command-line Tool」の手順です。

mkdir MyCLI
cd MyCLI
swift package init --name MyCLI --type executable
swift run MyCLI

作られるファイルと、swift run の表示です(swift.org の手順の記載)。

.
├── Package.swift
├── Sources
│   └── MyCLI
│       └── MyCLI.swift
└── Tests
    └── MyCLITests
        └── MyCLITests.swift
$ swift run MyCLI
Building for debugging...
Build complete! (3.39 sec)
Hello, world!

Swift Package Manager 6.4.1 のソース(InitPackage.swift)を読むと、--type executable のときに Sources/MyCLI/MyCLI.swift へ書き込まれる中身は次のとおりです。@main を付けた型の main() が入口になります。

// The Swift Programming Language
// https://docs.swift.org/swift-book

@main
struct MyCLI {
    static func main() {
        print("Hello, world!")
    }
}
--type の値 作られるもの
library(省略時) ほかのパッケージから使うライブラリ
executable 実行できるコマンド(上の例)
tool swift-argument-parser を使うコマンド
macro Swift のマクロ
build-tool-plugin・command-plugin Swift Package Manager のプラグイン
empty Package.swift だけ

同じソースで、swift package init で --type を省くと library になることと、テスト用のフォルダ(Tests)が既定で作られることも確かめました。

Swiftの基本文法の早見表

この節では、Swift の書き方を1つの表で引けます。それぞれの詳しい書き方は、この後の節にあります。

やりたいこと Swift の書き方 メモ
定数 let name = "Swift" 再代入できない。迷ったら let
変数 var count = 0 再代入できる
型を書く let price: Double = 70 書かなければ推論される
文字列に値を埋め込む "I have \(apples) apples." \( ) の中は式
複数行の文字列 """ で囲む 閉じる """ の位置で字下げを決める
配列 var fruits = ["apple", "lime"] 型は [String]
辞書 ["Malcolm": "Captain"] 型は [String: String]
範囲 0..<4(4を含まない)・1...5 for-in でよく使う
条件分岐 if x > 10 { } else { } 条件の ( ) は要らない。{ } は必須
多分岐 switch x { case 1: ... default: ... } すべての場合を書く。break は要らない
繰り返し for i in 0..<4 { }・while・repeat { } while
関数 func greet(person: String) -> String { } 呼ぶときは greet(person: "Bob")
値が無いかもしれない var name: String? = nil オプショナル
安全に取り出す if let name { }・guard let・name ?? "既定"
構造体(値型) struct Point { var x = 0.0 } 代入するとコピー
クラス(参照型) class Shape { } 代入しても同じものを指す。継承できる
プロトコル protocol Named { var name: String { get } } インターフェースに近い
クロージャ numbers.map { $0 * 3 } 名前の無い関数

ここから先の Swift のコードは、断りが無いかぎり公式の本「The Swift Programming Language」の例です。// 出力: の行は、本に書かれた出力です。

変数と定数・型(let・var・型推論)

この節では、let と var の使い分けと、型の書き方が分かります。

var myVariable = 42
myVariable = 50
let myConstant = 42

let は定数で、一度入れた値を変えられません。 変えようとするとコンパイルエラーになります。本のテストに記録されている、Swift のコンパイラの実際のエラーです。

let languageName = "Swift"
languageName = "Swift++"
// error: cannot assign to value: 'languageName' is a 'let' constant

変える予定が無い値は let にすると、うっかり書き換えるミスをコンパイラが止めてくれます。

型推論と型の書き方

let implicitInteger = 70        // Int と推論される
let implicitDouble = 70.0       // Double と推論される
let explicitDouble: Double = 70 // 型を書いて Double にする
型 例 意味
Int 42 整数(64ビットの環境では64ビット)
Double 3.14159 小数(64ビット)
Bool true・false 真偽値
String "Swift" 文字列
[Int] [1, 2, 3] Int の配列
[String: Int] ["a": 1] キーが String・値が Int の辞書

型の変換は自動では行われません。 文字列と数値をつなぐときは、String(width) のように変換するか、\( ) で埋め込みます。

let label = "The width is "
let width = 94
let widthLabel = label + String(width)

let apples = 3
let oranges = 5
let fruitSummary = "I have \(apples + oranges) pieces of fruit."

整数があふれるとエラーになる

本の「The Basics」には、Int8 の最大値に1を足すコードはエラーになると書かれています。Swift の算術演算子は、既定ではあふれを許しません。

let cannotBeNegative: UInt8 = -1
// UInt8 は負の数を入れられないので、エラーになる
let tooBig: Int8 = Int8.max + 1
// Int8 は最大値より大きい数を入れられないので、エラーになる

あふれて折り返す動き(C 言語の整数と同じ)がほしいときは、&+・&-・&* のような「オーバーフロー演算子」を使います。

オプショナルとは(? と if let・guard・??)

この節では、Swift でいちばんつまずきやすい「オプショナル」の意味と、値の取り出し方が分かります。

オプショナルは「値があるか、nil(値が無い)か」のどちらかを持つ型です。 型名の後ろに ? を付けて書きます。String? は「String か nil」です。Swift では、ふつうの String には nil を入れられません。

flowchart TD
    O[String? の値] --> Q{値はある?}
    Q -->|ある| S[String として使う<br>if let・guard let]
    Q -->|nil| D[既定値を使う ??<br>または処理を抜ける]

文字列を数値に変える Int("123") は、変換できないこともあるので Int? を返します。

let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
// convertedNumber の型は「オプショナルの Int」(Int?)

取り出し方の早見表

書き方 意味 nil のとき
if let n = x { } 値があれば n に入れて中を実行 中を飛ばす(else があれば else)
if let x { } 同じ名前で取り出す短い書き方 同上
guard let n = x else { return } 値が無ければ先に抜ける else の中で必ず抜ける
x ?? "既定値" 値か、無ければ既定値 既定値になる
x?.count 値があればプロパティを読む 式全体が nil
x! 値があるものとして取り出す 実行時に止まる

if letで取り出す

let possibleNumber = "123"
if let actualNumber = Int(possibleNumber) {
    print("The string \"\(possibleNumber)\" has an integer value of \(actualNumber)")
} else {
    print("The string \"\(possibleNumber)\" couldn't be converted to an integer")
}
// 出力: The string "123" has an integer value of 123

同じ名前で取り出すときは、if let nickname { のように短く書けます。

let nickname: String? = nil
let fullName: String = "John Appleseed"
let informalGreeting = "Hi \(nickname ?? fullName)"

if let nickname {
    print("Hey, \(nickname)")
}
// nickname が nil なので、何も出力されない

?? は「左が nil なら右を使う」演算子です。informalGreeting は "Hi John Appleseed" になります。

guard letで先に抜ける

guard は「条件が満たされなければ、ここで抜ける」書き方です。取り出した値は、guard より後ろでそのまま使えます。入力の確認を関数の先頭にまとめると、本題の処理の字下げが深くなりません。

func greet(person: [String: String]) {
    guard let name = person["name"] else {
        return
    }

    print("Hello \(name)!")

    guard let location = person["location"] else {
        print("I hope the weather is nice near you.")
        return
    }

    print("I hope the weather is nice in \(location).")
}

greet(person: ["name": "John"])
// 出力: Hello John!
// 出力: I hope the weather is nice near you.
greet(person: ["name": "Jane", "location": "Cupertino"])
// 出力: Hello Jane!
// 出力: I hope the weather is nice in Cupertino.

辞書から読んだ値(person["name"])も、キーが無いことがあるのでオプショナルです。

! で無理に取り出すと止まる

オプショナルの値を使いたいとき

止まる書き方let number = convertedNumber!(nil なら実行時に止まる)
→
止まらない書き方if let・guard let・?? で nil の場合を書く

! は「絶対に nil でない」と言い切れるときだけ。本は、! は実質的に fatalError(その場で止める関数)の短い書き方だと説明している

nil の値に ! を使うと、プログラムは次のメッセージで止まります。Swift 6.4.1 の標準ライブラリ(Optional.swift)にある文言です。

Fatal error: Unexpectedly found nil while unwrapping an Optional value

オプショナルを取り出さずに使うと、コンパイルの時点でエラーになります。Swift 6.4.1 のコンパイラのソースに定義されている文言で、'Int?' の部分には実際の型が入ります。

error: value of optional type 'Int?' must be unwrapped to a value of type 'Int'

このエラーと一緒に、コンパイラは「?? で既定値を与える」「! で強制的に取り出す」という2つの直し方を候補として出します。どちらを選ぶかは、nil のときにどうしたいかで決めます。

Kotlin の ?.・?:・!! と同じ考え方です。Kotlin 側の書き方は、関連記事「Kotlin null安全の使い方|?. ?: !! letの違い早見表」で扱っています。

制御構文(if・switch・for-in・while)

この節では、条件分岐と繰り返しの書き方と、Swift らしい決まりが分かります。

let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
    if score > 50 {
        teamScore += 3
    } else {
        teamScore += 1
    }
}
print(teamScore)
// 出力: 11

条件の ( ) は省けますが、{ } は1行でも省けません。 また、条件は必ず Bool です。if score { } のように整数をそのまま書くと、本のテストに記録された次のエラーになります。

error: type 'Int' cannot be used as a boolean; test for '!= 0' instead

if と switch は値を返す式としても使えます。

let scoreDecoration = if teamScore > 10 {
    "🎉"
} else {
    ""
}
print("Score:", teamScore, scoreDecoration)
// 出力: Score: 11 🎉

switchはすべての場合を書く

let vegetable = "red pepper"
switch vegetable {
case "celery":
    print("Add some raisins and make ants on a log.")
case "cucumber", "watercress":
    print("That would make a good tea sandwich.")
case let x where x.hasSuffix("pepper"):
    print("Is it a spicy \(x)?")
default:
    print("Everything tastes good in soup.")
}
// 出力: Is it a spicy red pepper?
決まり 内容 違反したとき
すべての場合を書く 漏れがあれば default が要る error: switch must be exhaustive
break は要らない 合った case を実行したら抜ける。次の case へ進むのは fallthrough を書いたときだけ ―
case の中は空にできない 何もしないなら break と書く 'case' label in a 'switch' must have at least one executable statement
条件を付けられる case let x where 条件: ―

for-inとwhile

var total = 0
for i in 0..<4 {
    total += i
}
print(total)
// 出力: 6

var n = 2
while n < 100 {
    n *= 2
}
print(n)
// 出力: 128

0..<4 は 0・1・2・3(4を含まない)、1...5 は 1〜5(5を含む)です。repeat { } while 条件 は、条件を後で調べる(必ず1回は実行する)繰り返しです。

関数(引数ラベル・戻り値・タプル)

この節では、関数の定義と、Swift 独特の「引数ラベル」が分かります。

func greet(person: String, day: String) -> String {
    return "Hello \(person), today is \(day)."
}
greet(person: "Bob", day: "Tuesday")

呼び出すときは、引数の名前(ラベル)を付けて書きます。 ラベルを外へ見せる名前と中で使う名前に分けたり、_ で省いたりできます。

func greet(_ person: String, on day: String) -> String {
    return "Hello \(person), today is \(day)."
}
greet("John", on: "Wednesday")
定義 呼び方 用途
func greet(person: String) greet(person: "Bob") 基本の形
func greet(_ person: String) greet("Bob") ラベルを省く
func greet(_ person: String, on day: String) greet("John", on: "Wednesday") 外向きのラベル on と中の名前 day を分ける
func f(x: Int = 0) f() または f(x: 3) 既定値
func swap(_ a: inout Int, _ b: inout Int) swap(&x, &y) 引数そのものを書き換える

ラベルを付け忘れると error: missing argument label 'x:' in call のようなエラーになります(本のテストに記録された出力)。

複数の値はタプルでまとめて返せます。

func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) {
    var min = scores[0]
    var max = scores[0]
    var sum = 0

    for score in scores {
        if score > max {
            max = score
        } else if score < min {
            min = score
        }
        sum += score
    }

    return (min, max, sum)
}
let statistics = calculateStatistics(scores: [5, 3, 100, 3, 9])
print(statistics.sum)
// 出力: 120
print(statistics.2)
// 出力: 120

構造体とクラスの違い(値型と参照型)

この節では、Swift で迷いやすい struct(構造体)と class(クラス)の違いと、どちらを選ぶかが分かります。

構造体は値型で、代入するとコピーされます。クラスは参照型で、代入しても同じ1つのインスタンスを指します。

struct Resolution {
    var width = 0
    var height = 0
}
class VideoMode {
    var resolution = Resolution()
    var interlaced = false
    var frameRate = 0.0
    var name: String?
}

構造体の例です。cinema は hd のコピーなので、cinema を変えても hd は変わりません。

let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
cinema.width = 2048
print("cinema is now \(cinema.width) pixels wide")
// 出力: cinema is now 2048 pixels wide
print("hd is still \(hd.width) pixels wide")
// 出力: hd is still 1920 pixels wide

クラスの例です。alsoTenEighty と tenEighty は同じインスタンスを指すので、片方を変えると両方から変わって見えます。

let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0

let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0
print("The frameRate property of tenEighty is now \(tenEighty.frameRate)")
// 出力: The frameRate property of tenEighty is now 30.0
flowchart TD
    H[struct の hd<br>width 1920 のまま] -->|代入でコピー| C[cinema だけ<br>2048 に変わる]
    C ~~~ T[class の<br>tenEighty]
    T --> I[同じインスタンス<br>frameRate 30.0]
    A[alsoTenEighty] --> I

構造体(struct)

値型。代入・引数渡しでコピーとして振る舞う

継承できない。プロトコルで機能を足す

全プロパティを受け取る初期化子が自動で作られる

自分を書き換えるメソッドには mutating が要る

クラス(class)

参照型。代入しても同じインスタンスを指す

継承できる(1つの親クラスから)

同じインスタンスかを === で比べられる

ARC で参照が0になると解放され、deinit が呼ばれる

Swift の標準の String・Array・Dictionary も構造体です。Java の String や ArrayList がクラス(参照型)なのとは違い、配列を別の変数に代入して書き換えても、元の配列は変わりません。

mutatingと、letの構造体

構造体のメソッドが自分のプロパティを書き換えるときは、mutating を付けます。

struct Point {
    var x = 0.0, y = 0.0
    mutating func moveBy(x deltaX: Double, y deltaY: Double) {
        x += deltaX
        y += deltaY
    }
}
var somePoint = Point(x: 1.0, y: 1.0)
somePoint.moveBy(x: 2.0, y: 3.0)
print("The point is now at (\(somePoint.x), \(somePoint.y))")
// 出力: The point is now at (3.0, 4.0)

let で作った構造体は、中のプロパティが var でも変えられません。本のテストに記録されたエラーです。

let fixedPoint = Point(x: 3.0, y: 3.0)
fixedPoint.moveBy(x: 2.0, y: 3.0)
// error: cannot use mutating member on immutable value: 'fixedPoint' is a 'let' constant

どちらを使うかの判断表

状況 選ぶもの 理由
座標・金額・設定値など、値そのものを表す struct コピーされるので、どこかで書き換わる心配が無い
迷ったとき struct 本も、独自のデータ型の多くは構造体と列挙型で定義すると説明している
同じものを複数の場所から共有して変えたい class 参照型なので変更が全員に見える
継承が要る(UIKit のクラスを継承する等) class 構造体は継承できない
同じインスタンスかを比べたい(===) class 構造体に「同じインスタンス」は無い
複数のタスクから安全に変えたい actor 中の値への同時アクセスを Swift が直列にする

Java の「値渡し・参照渡し」の考え方と比べると、構造体のコピーの意味がつかみやすくなります。関連記事「Javaは値渡し?参照渡し?引数の変更が反映される条件」で扱っています。

列挙型(enum)と関連値

この節では、Swift の列挙型が、値を持てる強力な型であることが分かります。

enum ServerResponse {
    case result(String, String)
    case failure(String)
}

let success = ServerResponse.result("6:00 am", "8:09 pm")
let failure = ServerResponse.failure("Out of cheese.")

switch success {
case let .result(sunrise, sunset):
    print("Sunrise is at \(sunrise) and sunset is at \(sunset).")
case let .failure(message):
    print("Failure...  \(message)")
}
// 出力: Sunrise is at 6:00 am and sunset is at 8:09 pm.

result は2つの文字列、failure は1つの文字列を一緒に持っています(関連値)。switch で case ごとに取り出せて、すべての case を書かないとコンパイルエラーになるので、case を足したときの直し漏れをコンパイラが見つけてくれます。整数などの「元の値(raw value)」を持たせることもできます(enum Rank: Int { case ace = 1 ... })。

プロトコルとextension

この節では、Java・Kotlin のインターフェースにあたるプロトコルと、既存の型に機能を足す extension が分かります。

protocol ExampleProtocol {
     var simpleDescription: String { get }
     mutating func adjust()
}

struct SimpleStructure: ExampleProtocol {
     var simpleDescription: String = "A simple structure"
     mutating func adjust() {
          simpleDescription += " (adjusted)"
     }
}
var b = SimpleStructure()
b.adjust()
let bDescription = b.simpleDescription

プロトコルは、クラスだけでなく構造体と列挙型にも付けられます。 extension を使うと、標準の Int のような既存の型にも、あとからプロトコルを付けられます。

extension Int: ExampleProtocol {
    var simpleDescription: String {
        return "The number \(self)"
    }
    mutating func adjust() {
        self += 42
    }
 }
print(7.simpleDescription)
// 出力: The number 7
機能 Swift Java Kotlin
約束(型が持つべきもの) protocol interface interface
構造体・列挙型に付ける できる (構造体は無い)enum には付けられる enum class には付けられる
既存の型にあとから機能を足す extension できない 拡張関数
プロトコル型の値 let v: any ExampleProtocol インターフェース型の変数 インターフェース型の変数

クロージャ(名前の無い関数)

この節では、Swift のクロージャの書き方と、短く書く方法が分かります。

クロージャは、名前の無い関数です。 関数に処理を渡すときに使います。次の3つは同じ処理を、だんだん短く書いたものです。

var numbers = [20, 19, 7, 12]

numbers.map({ (number: Int) -> Int in
    let result = 3 * number
    return result
})

let mappedNumbers = numbers.map({ number in 3 * number })
print(mappedNumbers)
// 出力: [60, 57, 21, 36]

let sortedNumbers = numbers.sorted { $0 > $1 }
print(sortedNumbers)
// 出力: [20, 19, 12, 7]
書き方 意味
{ (number: Int) -> Int in ... } 引数・戻り値の型を全部書いた形。in の後が本体
{ number in 3 * number } 型は推論させる。1つの式なら return を省ける
{ $0 > $1 } 引数を $0・$1 と番号で呼ぶ
sorted { ... } 最後の引数がクロージャなら ( ) の外に出せる(後置クロージャ)

Kotlin の { it * 3 }、Java の n -> 3 * n と同じ役割です。JavaScript で「クロージャ」と呼ぶ、外の変数を覚えておく働きも同じように持っています。関連記事「JavaScript クロージャとは?使いどころ7例をコード付きで図解」で扱っています。

エラー処理と非同期処理(throws・try・async・await)

この節では、失敗しうる処理と、時間のかかる処理の書き方が分かります。

throws・try・do-catch

enum PrinterError: Error {
    case outOfPaper
    case noToner
    case onFire
}

func send(job: Int, toPrinter printerName: String) throws -> String {
    if printerName == "Never Has Toner" {
        throw PrinterError.noToner
    }
    return "Job sent"
}

do {
    let printerResponse = try send(job: 1040, toPrinter: "Bi Sheng")
    print(printerResponse)
} catch {
    print(error)
}
// 出力: Job sent

let printerSuccess = try? send(job: 1884, toPrinter: "Mergenthaler")
let printerFailure = try? send(job: 1885, toPrinter: "Never Has Toner")
書き方 意味
func f() throws -> T エラーを投げる可能性がある関数
func f() throws(PrinterError) 投げるエラーの型を1つに決める(Swift 6 から)
try f() 投げうる関数を呼ぶ印。do { } catch { } の中か、throws の関数の中で使う
try? f() エラーなら nil にする(結果はオプショナル)
try! f() エラーにならないと言い切る。エラーなら実行時に止まる
defer { } 今のスコープ(関数など)を抜けるときに必ず実行する

try を付けずに呼ぶと、error: call can throw but is not marked with 'try' になります(本のテストに記録された出力)。Java の検査例外と同じく、エラーを無視したまま呼ぶことをコンパイラが許しません。

async・await

func fetchUserID(from server: String) async -> Int {
    if server == "primary" {
        return 97
    }
    return 501
}

func fetchUsername(from server: String) async -> String {
    let userID = await fetchUserID(from: server)
    if userID == 501 {
        return "John Appleseed"
    }
    return "Guest"
}

func connectUser(to server: String) async {
    async let userID = fetchUserID(from: server)
    async let username = fetchUsername(from: server)
    let greeting = await "Hello \(username), user ID \(userID)"
    print(greeting)
}

Task {
    await connectUser(to: "primary")
}
// 出力: Hello Guest, user ID 97

async let は、2つの処理を同時に始めて、await で両方の結果を待つ書き方です。本の「Concurrency」は、複数のタスクが同じ値を同時に書き換えるデータ競合を Swift が検出し、その多くはコンパイル時のエラーになると説明しています。共有する状態は actor に入れると、中の値への同時アクセスを Swift が1つずつに並べます。

SwiftUIの最小例(画面を作る)

この節では、SwiftUI でボタンを押すと数が増える画面を作る、最小のコードが分かります。

SwiftUI は、画面を「View プロトコルに合う構造体」の組み合わせで書く Apple の仕組みです。 次のコードは、Apple Developer Documentation の App と State の説明に沿って書いたものです(本の例ではありません)。Xcode で新しく作った SwiftUI のプロジェクトの2つのファイルに書くと、カウンターのアプリになります。

import SwiftUI

@main
struct CounterApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
import SwiftUI

struct ContentView: View {
    @State private var count = 0

    var body: some View {
        VStack(spacing: 16) {
            Text("押した回数: \(count)")
                .font(.title)
            Button("1 増やす") {
                count += 1
            }
            .buttonStyle(.borderedProminent)
        }
        .padding()
    }
}

#Preview {
    ContentView()
}
部品 役割
@main struct CounterApp: App アプリの入口。Apple のドキュメントでは、入口はアプリ全体で1つだけ
WindowGroup { } ウィンドウ(iPhone では画面全体)に表示する中身
struct ContentView: View 画面の部品。body で見た目を返す
@State private var count 画面が持つ状態。値が変わると、それを使う部分だけ描き直される
VStack・Text・Button 縦に並べる・文字を出す・ボタン
.font(.title)・.padding() モディファイア。見た目を変える
#Preview { } Xcode のキャンバスにプレビューを出す

Apple の State のドキュメントは、@State のプロパティを private にするよう勧めています。外から初期値を渡せてしまうと、SwiftUI が行う保存の管理とぶつかることがあるためです。子のビューに値を書き換えさせたいときは、$count の形で Binding を渡します。

  • 1画面の部品は struct で、View に合わせているbody で返すのは「どう見えるか」の宣言。手順ではなく状態から見た目を決める
  • 2画面が変わる値は @State(private)に置いているふつうの var は、値が変わっても画面に反映されない
  • 3子に書き換えさせる値は $ を付けて Binding で渡している読むだけなら、値をそのまま渡す
  • 4#Preview でキャンバスに表示して確かめているシミュレータを起動しなくても見た目を確かめられる

Flutter も「ウィジェットを組み合わせて、状態から画面を作る」という似た考え方です。関連記事「Flutterとは|始め方・インストールとDartの基本を図と実例で解説」で扱っています。

Kotlin・Java・Dartとの対応表

この節では、ほかの言語を知っている人が、Swift の書き方を対応で引けます。

項目 Swift Kotlin Java Dart
定数 let val final final・const
変数 var var 型名 または var var
文字列への埋め込み "\(x)" "$x"・"${x}" + で連結・formatted() "$x"・"${x}"
nil を持てる型 String? String? 型では区別しない(Optional<String>) String?
あれば呼ぶ x?.count x?.length opt.map(...) x?.length
無ければ既定値 x ?? "a" x ?: "a" opt.orElse("a") x ?? "a"
強制的に取り出す x! x!! opt.get() x!
取り出して使う if let x { } x?.let { }・null チェック後のスマートキャスト opt.ifPresent(...) null チェック後の型の昇格
値型のデータ struct なし(data class は参照型) なし(record は参照型) なし(record は不変の値)
インターフェース protocol interface interface 暗黙のインターフェース・interface class
既存の型に機能を足す extension 拡張関数 なし extension
ラムダ・クロージャ { $0 * 3 } { it * 3 } n -> 3 * n (n) => 3 * n
データ付きの列挙 enum の関連値 sealed class sealed interface+record sealed class
例外の検査 throws・try を求める 求めない 検査例外を求める 求めない
非同期 async・await・actor suspend・コルーチン CompletableFuture・仮想スレッド async・await・Future
メモリ管理 ARC(参照カウント) GC(JVM) GC GC

Dart の null 安全の記号(?・!・?.・late)は dart.dev の「Understanding null safety」で確かめました。Swift のオプショナルの記号は、Dart とほぼ同じです。

同じ処理をKotlin・Javaで動かした結果

本の Swift の例(オプショナル・構造体のコピー・クロージャ)を Kotlin と Java に書き直し、Kotlin 2.4.20 と OpenJDK 21.0.10 で実行しました。違いがいちばん出るのは、代入したときにコピーになるかどうかです。

data class Resolution(var width: Int = 0, var height: Int = 0)

fun main() {
    val nickname: String? = null
    val fullName = "John Appleseed"
    println("Hi ${nickname ?: fullName}")
    println(nickname?.length)
    nickname?.let { println("Hey, $it") }

    // Kotlin の data class は参照型
    val hd = Resolution(width = 1920, height = 1080)
    val cinema = hd
    cinema.width = 2048
    println("cinema is now ${cinema.width} pixels wide")
    println("hd is now ${hd.width} pixels wide")

    // コピーが欲しいときは copy() を明示する
    val hd2 = Resolution(width = 1920, height = 1080)
    val cinema2 = hd2.copy()
    cinema2.width = 2048
    println("hd2 is still ${hd2.width} pixels wide")

    val numbers = listOf(20, 19, 7, 12)
    println(numbers.map { 3 * it })
    println(numbers.sortedDescending())
}
$ kotlinc Compare.kt -include-runtime -d compare.jar && java -jar compare.jar
Hi John Appleseed
null
cinema is now 2048 pixels wide
hd is now 2048 pixels wide
hd2 is still 1920 pixels wide
[60, 57, 21, 36]
[20, 19, 12, 7]

Kotlin では cinema を変えると hd も 2048 になりました。 Swift の構造体の例では hd は 1920 のままでした。Kotlin で同じ結果にするには copy() を明示します。Java のクラスも同じく参照型で、hd is now 2048 pixels wide と出ました。

同じ「nil(null)のまま長さを読む」ミスが、3つの言語でどこで見つかるかを比べました。

言語 見つかる時点 出たメッセージ
Swift コンパイル時 value of optional type 'String?' must be unwrapped to refer to member 'count' of wrapped base type 'String'(コンパイラのソースの定義)
Kotlin 2.4.20 コンパイル時 error: only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type 'String?'.(実行結果)
Java 21 実行時 Cannot invoke "String.length()" because "name" is null(NullPointerException の実行結果)

Kotlin と Java の書き方の違いは、関連記事「Kotlin入門|Javaとの違いと基本文法をコピペで学ぶ【2.4対応】」で扱っています。

Swiftのよくあるエラーと直し方

この節では、Swift を書き始めたときによく出るエラーの原文と、直し方を引けます。

「本のテスト」は swift-book のテストに記録されたコンパイラの出力、「ソース」は Swift 6.4.1 のコンパイラ・標準ライブラリに定義された文言です(ソースの文言の '…' の部分には実際の名前や型が入ります)。

エラー(原文) 原因 直し方
cannot assign to value: 'languageName' is a 'let' constant(本のテスト) let の定数に再代入した 変えるなら var にする
value of optional type 'Int?' must be unwrapped to a value of type 'Int'(ソース) オプショナルを取り出さずに使った if let・guard let・?? で取り出す
Fatal error: Unexpectedly found nil while unwrapping an Optional value(ソース) nil に ! を使った(実行時) ! をやめ、nil の場合を書く
Fatal error: Index out of range(ソース) 配列の範囲外を読んだ(実行時) indices.contains(i) や first・last を使う
cannot use mutating member on immutable value: 'fixedPoint' is a 'let' constant(本のテスト) let の構造体で mutating メソッドを呼んだ var で作る
switch must be exhaustive(ソース) switch に漏れがある 足りない case か default を書く
missing argument label 'x:' in call(本のテスト) 呼び出しで引数ラベルを書き忘れた f(x: 7) のようにラベルを付ける
type 'Int' cannot be used as a boolean; test for '!= 0' instead(本のテスト) if の条件に整数を書いた if i != 0 のように Bool にする
call can throw but is not marked with 'try'(本のテスト) throws の関数を try なしで呼んだ try を付け、do-catch で受ける
expression is 'async' but is not marked with 'await'(本のテスト) async の関数を await なしで呼んだ await を付ける。呼ぶ側も async にする
cannot find 'x' in scope(本のテスト) 名前の打ち間違い・宣言していない・範囲の外 綴りと宣言の場所を確かめる
arithmetic operation '127 + 1' (on type 'Int8') results in an overflow(ソース) 定数の計算が型の範囲を超えた 大きい型(Int)にするか &+ を使う

実行時に止まる2つ(Fatal error: ...)は、ビルドが通ってから起きます。どちらも「でたらめな値で進み続けるより、その場で止める」という Swift の方針(特徴の節の6つ)によるものです。

1

エラーの1行目の英文を読む

Xcode ではエラーの行に赤い印が付きます。文中の 'let' constant・optional type・exhaustive などの言葉で、上の表のどれかを探します。

型名と変数名が文中に出る

2

コンパイラの直し方の候補を見る

オプショナルのエラーでは「?? で既定値」「! で取り出す」の候補が出ます。候補をそのまま選ぶ前に、nil のときにどうしたいかを決めます。

! の候補を選ぶと、nil のとき実行時に止まる

3

実行時に止まったら、止まった行を見る

Fatal error の行と、Xcode のデバッガが示す行で、nil や範囲外の値がどこから来たかをたどります。

! と配列の添字の行が多い

Swiftの学び方と順番(迷ったときの判断表)

この節では、Swift をどの順番で、何を使って学ぶかが分かります。

  1. 1基本文法を読む変数・型・制御構文・関数。この記事の早見表と、本の Guided Tour
  2. 2オプショナルに慣れるif let・guard let・?? を使い分け、! を使わずに書く
  3. 3struct・class・protocol を使い分けるまず struct で書き、共有や継承が要るときだけ class にする
  4. 4SwiftUI で画面を1つ作る@State と Button で、押すと変わる画面を作る
  5. 5async・await でデータを読み込む通信の結果を画面に出す。Swift 6 言語モードの警告を直す
状況 選ぶもの 理由
Mac(M1 以降)があり、iPhone アプリを作りたい Xcode+SwiftUI シミュレータとプレビューまでそろう
iPad しかない・まず触ってみたい Swift Playgrounds 無料のレッスンで基本を学べる
Windows・Linux で文法だけ学びたい swift.org のツールチェーン+VS Code 画面の無いプログラムで文法を確かめられる
Intel の Mac しかない swift.org のツールチェーン(文法の学習)。アプリ開発には Apple M1 以降の Mac が要る Xcode 27 は Apple M1 以降が必要
Kotlin・Java を知っている この記事の対応表から読む 違いは値型(struct)と ARC
自分の iPhone で動かしたい 無料の Apple アカウント(Personal Team) 7日で期限が切れる制限つき
App Store・TestFlight で配りたい Apple Developer Program(年99米ドル) 配信と外部テスターの招待ができる

学ぶための公式の資料

資料 内容 入手先
The Swift Programming Language 公式の本。Guided Tour(文法の一周)・Language Guide・Reference docs.swift.org(無料)
Swift Playgrounds レッスン形式のアプリ(日本語あり) App Store(無料)
SwiftUI のチュートリアル・ドキュメント 画面の作り方 Apple Developer(無料)
swift.org の Getting Started コマンドラインのツール・サーバー・VS Code swift.org(無料)

Apple のメンバーシップの比較ページによると、無料の Apple アカウントで Xcode の Personal Team を使うと、自分の機器にアプリを入れられます。ただし、アプリ ID は10個まで、機器は3台まで、プロビジョニングプロファイルは7日で期限切れになります。App Store での配信、TestFlight でのテスターの招待は Apple Developer Program(年99米ドル、または現地通貨の同等額。2026年10月22日時点)の機能です。

ARC と、Java の GC(ガベージコレクション)の仕組みの違いを比べたいときは、関連記事「Java ガベージコレクションの仕組みとGC種類比較|ログの読み方まで」で扱っています。

よくある質問

Q. Swiftとは何ですか? A. Apple が2014年に発表した、iPhone・iPad・Mac などのアプリを作るためのプログラミング言語です。オープンソースで、Linux・Windows でも使えます。2026年10月22日時点の最新版は Swift 6.4.1 です。

Q. Swiftの読み方は? A. 「スウィフト」です。英語の swift(速い)が由来です。

Q. 国際送金の SWIFT と関係はありますか? A. ありません。国際送金の SWIFT は、銀行どうしの送金の通信網を運営する組織(国際銀行間金融通信協会)です。「Swiftとは」の節の見分け表にまとめています。

Q. Swift は Windows で使えますか? A. swift.org のツールチェーンを winget で入れると、Windows でコマンドやサーバーのプログラムを書けます。iPhone・Mac のアプリを作る Xcode と SwiftUI のプレビューは Mac にしかありません。

Q. Swift と SwiftUI の違いは? A. Swift はプログラミング言語、SwiftUI は Swift で画面を作るための Apple の仕組み(フレームワーク)です。SwiftUI のコードも Swift で書きます。「SwiftUIの最小例」の節にコードがあります。

Q. Swift と Xcode の違いは? A. Swift は言語、Xcode はそれを書いてビルドし、シミュレータで動かすための Apple の開発ツールです。Xcode 27.1 には Swift 6.4 のコンパイラが入っています。

Q. Swift は難しいですか? A. 基本文法は短く書けますが、Java・Python から来た人はオプショナル(?・if let)と、構造体が代入でコピーされる点でつまずきやすいです。この記事のオプショナルと構造体の節で、その2点を例と図で説明しています。

Q. Swift と Kotlin の違いは? A. 書き方はよく似ています(let/val、String?、??/?:)。大きな違いは、Swift には値型の struct があり、メモリを ARC で管理する点です。Kotlin の data class は参照型でした(対応表の節の実行結果)。

Q. Swift の最新バージョンは? A. 2026年10月22日時点で Swift 6.4.1(swift.org)です。Xcode 27・27.1 には Swift 6.4 のコンパイラが入っています。

Q. Swift の将来性は? A. Apple のすべての OS のアプリで使われる標準の言語で、6.x の間はおおむね半年ごとに新しい版が出ています。TIOBE Index(2026年10月)では14位でした。

まとめ

  • Swift は Apple が2014年に発表したプログラミング言語。国際送金の SWIFT とは別物。2026年10月22日時点の最新版は 6.4.1。
  • iPhone・Mac のアプリは、Apple M1 以降の Mac に Xcode 27.1(macOS 26.6 以降)を入れて作る。Windows・Linux でもコマンドやサーバーは書ける。
  • 定数は let、変数は var。型は推論され、整数のあふれや配列の範囲外はその場で止まる。
  • 値が無いかもしれない値はオプショナル(String?)。if let・guard let・?? で取り出し、! は nil のとき止まる。
  • 構造体は値型(代入でコピー)、クラスは参照型。迷ったら構造体から。Kotlin の data class は参照型だった。
  • SwiftUI は View に合わせた構造体で画面を書き、@State の値が変わると画面が描き直される。

参考・出典

確認日はいずれも 2026年10月22日です。

  • The Swift Programming Language(Swift 6.4):https://docs.swift.org/swift-book/
  • swiftlang/swift-book(本のソースとテスト):https://github.com/swiftlang/swift-book
  • swiftlang/swift(Swift 6.4.1 のソース・タグ):https://github.com/swiftlang/swift
  • swiftlang/swift-package-manager(InitPackage.swift):https://github.com/swiftlang/swift-package-manager
  • Swift.org「Install Swift」(Linux):https://www.swift.org/install/linux/
  • Swift.org「Install Swift」(macOS):https://www.swift.org/install/macos/
  • Swift.org「Install Swift」(Windows):https://www.swift.org/install/windows/
  • Swift.org「Build a Command-line Tool」:https://www.swift.org/getting-started/cli-swiftpm/
  • Swift.org「Getting Started with Swift in VS Code」:https://www.swift.org/documentation/articles/getting-started-with-vscode-swift.html
  • Swift.org「What's new in Swift: June 2026 Edition」:https://swift.org/blog/whats-new-in-swift-june-2026/
  • Swift.org「Swift 5 Released!」:https://www.swift.org/blog/swift-5-released/
  • Apple「Swift」:https://www.apple.com/jp/swift/
  • Apple「Swift Playgrounds」:https://www.apple.com/jp/swift/playgrounds/
  • App Store「Xcode」:https://apps.apple.com/jp/app/xcode/id497799835
  • App Store「Swift Playgrounds」:https://apps.apple.com/jp/app/swift-playgrounds/id908519492
  • Apple Developer「Xcode」:https://developer.apple.com/jp/xcode/
  • Apple Developer「Xcode のサポート」:https://developer.apple.com/support/xcode/
  • Apple Developer Documentation「Creating an Xcode project for an app」:https://developer.apple.com/documentation/xcode/creating-an-xcode-project-for-an-app
  • Apple Developer Documentation「Downloading and installing additional Xcode components」:https://developer.apple.com/documentation/xcode/downloading-and-installing-additional-xcode-components
  • Apple Developer Documentation「Running code snippets using the playground macro」:https://developer.apple.com/documentation/xcode/running-code-snippets-using-the-playground-macro
  • Apple Developer Documentation「App」(SwiftUI):https://developer.apple.com/documentation/swiftui/app
  • Apple Developer Documentation「State」(SwiftUI):https://developer.apple.com/documentation/swiftui/state
  • Apple Developer Documentation「Importing Objective-C into Swift」:https://developer.apple.com/documentation/swift/importing-objective-c-into-swift
  • Apple Developer Documentation「Importing Swift into Objective-C」:https://developer.apple.com/documentation/swift/importing-swift-into-objective-c
  • Apple「Programming with Objective-C - Working with Objects」:https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithObjects/WorkingwithObjects.html
  • Apple Developer「メンバーシップの比較」:https://developer.apple.com/jp/support/compare-memberships/
  • Apple Developer「Apple Developer Program」:https://developer.apple.com/jp/programs/
  • Apple Developer「購入と有効化」:https://developer.apple.com/jp/support/purchase-activation/
  • Dart「Understanding null safety」:https://dart.dev/null-safety/understanding-null-safety
  • TIOBE Index:https://www.tiobe.com/tiobe-index/
  • Swift(SWIFT 公式サイト「About us」):https://www.swift.com/about-us
  • 三井住友フィナンシャルグループ「SWIFT」(用語集):https://www.smfg.co.jp/dx_link/dictionary/0100.html

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Swiftとは|プログラミング言語の特徴・基本文法・SwiftUI入門」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?