(Translated by https://www.hiragana.jp/)
Swift - Wikibooks コンテンツにスキップ

Swift

出典しゅってん: フリー教科書きょうかしょ『ウィキブックス(Wikibooks)』
Wikipedia
Wikipedia
ウィキペディアSwift (プログラミング言語げんご)記事きじがあります。

Swiftは、Appleが、iOS、iPadOS、macOS、tvOS、および watchOS のために開発かいはつしたオープンソースのプログラミング言語げんごです。

目次もくじ

環境かんきょう準備じゅんび

オンラインコンパイル実行じっこう

ローカルにコンパイル実行じっこう環境かんきょうつくるのが困難こんなん、すぐにコンパイルと実行じっこうためしてみたい。そんな場合ばあいには、オンラインコンパイル実行じっこう環境かんきょう使つかうことも検討けんとうあたいします。

Swift Playgrounds
公式こうしきのオンラインコンパイル実行じっこう環境かんきょうです。
paiza.io
複数ふくすうのプログラミン言語げんご対応たいおうしており、Swiftにも対応たいおうしています。

ビルドみバイナリーの導入どうにゅう

公式こうしきサイトの、Download Swiftからインストーラーを入手にゅうしゅするのが基本きほんです。

iPadOS
Appleから、「Swift Playgrounds」が学生がくせい対象たいしょう公開こうかいされています。
Swift Playgroundsは開発かいはつ環境かんきょうであるとともに、Swiftの基本きほん習得しゅうとくするためのチュートリアルをふくんでいます。
macOS
Swiftを開発かいはつしたAppleのプラットフォームです。
macOS 10.9 以降いこうをサポートしています。
Xcodeに統合とうごうされています。
複数ふくすうのツールチェインがSwiftをサポートしているので、目的もくてきおうじてえて使用しようします。
Windows
Windows10以降いこうをサポートしています(Windows8.1以前いぜんはサポート対象たいしょうがい)。swift公式こうしきサイトではwingetなどパッケージマネージャをもちいてインストールすることを推奨すいしょうしている[1](※2023ねん現在げんざい公式こうしきサイトのwinget関連かんれんのコマンドを使つかっても、うまくかなかった)。なおそのダウンロード内容ないようは、swift公式こうしきサイトのSDKのインストールにくわえて、さらに Visual Studio 2019 以降いこうをインストールして『C++によるデスクトップ開発かいはつ』の標準ひょうじゅん設定せっていをインストールする必要ひつようがある。なお、Powershellからでもコマンドプロンプトからでも、どちらかでもコマンド実行じっこうできる。
GNU/Linuxのディストリビューション
GNU/Linuxのディストリビューションの場合ばあい公式こうしきにサポートされているディストリビューションと公式こうしきにはサポートされず独自どくじにパッケージを用意よういしていディストリビューションがあります。

公式こうしきにサポートされているディストリビューション

公式こうしきサイトの、Download SwiftからTARBALLをダウンロードしてインストールします。

Ubuntu
18.04 以降いこうをサポートしています。
CentOS
7 以降いこうをサポートしています。
Amazon Linux
2 以降いこうをサポートしています。

公式こうしきにサポートされていないディストリビューション

パッケージマネージャによってパッケージめい依存いぞん関係かんけい、インストールに使用しようするコマンドがことなります。

公式こうしきでは、RPMでも提供ていきょうされていますが experimental use only との位置いちづけです

Fedoraの場合ばあい
Fedora 独自どくじのパッケージリポジトリーから非公式ひこうしきばんをインストールします。
最新さいしん利用りよう可能かのうなバージョンへインストールみパッケージを同期どうきする
$ sudo dnf distro-sync
インストール
$ sudo dnf install swift-lang

ソースコードからのビルド

最新さいしんのあるいはリリースまえのバージョンのSwiftをインストールしたい場合ばあいは、ソースコードを入手にゅうしゅしビルドします。

  1. ソースコードの入手にゅうしゅ
    https://github.com/apple/swift から clone します。
  2. ビルド環境かんきょう構築こうちく
    ビルド環境かんきょう構築こうちくのために build-toolchain スクリプトが用意よういされています。--help ですべてのオプションの説明せつめいることが出来できます。
  3. コンフィギュレーション
  4. ビルド
  5. テスト
  6. インストール

バージョン確認かくにんコマンド

インストールに成功せいこうしたとおもったら、バージョン確認かくにんなど簡単かんたんなコマンドを実行じっこうしてみましょう。

swift --version

確認かくにんできます。

実行じっこう結果けっかいちれい(WindowsのPowershellから実行じっこう

PS C:\Users\ユーザーめい> swift -version
compnerd.org Swift version 5.8.1 (swift-5.8.1-RELEASE)
Target: x86_64-unknown-windows-msvc

実行じっこう方法ほうほう

Hello World

コードは

hello.swift
print( "Hello, World!" )

の1ぎょうです。これをテキストエディターでコードをき、ファイルめい hello.swift 保存ほぞんします。swiftのソースファイルの拡張子かくちょうしには .swift使つかわれます。

コンパイルする場合ばあい

実行じっこう方法ほうほうは、まずコンパイルのために

$ swiftc ファイルめい.swift

実行じっこうします。

すると、標準ひょうじゅん設定せっていならカレントディレクトリなどシステム標準ひょうじゅん場所ばしょファイルめい実行じっこうファイルが出来できるので、あとはそれを通常つうじょう実行じっこうファイルとおな方法ほうほう実行じっこうします。

MS-DOSやWindowsでは、PATHがかよっていなくてもカレントフォルダのファイルを名前なまえつだけで実行じっこうできますが、のプラットフォームの場合ばあい

$ ./ファイルめい

のようなに ./まえおけしてカレントディレクトのファイルであることを明示めいじして実行じっこうします。

インタプリタの場合ばあい

コマンド

$ swift ファイルめい.swift

で、コンパイルと実行じっこうおこなえます。

かつては「swift run ファイルめい.swift」というコマンドでしたが、いまでは廃止はいしされ、うえのようなコマンドになっています。

対話たいわモードの場合ばあい

$ swift

対話たいわモードになります。

終了しゅうりょうしたい場合ばあい、Ctrl + D ボタンで終了しゅうりょうします。

定数ていすう変数へんすう

変数へんすう

変数へんすうは、むすびついた識別子しきべつし初期しょき代入だいにゅうによってむすびつくえることが出来できます。 変数へんすうは、キーワード var使つかって宣言せんげんします。

変数へんすう宣言せんげん
var 変数へんすうめい: かた = しき

定数ていすう

定数ていすうは、いちしか初期しょきあるいは代入だいにゅうできない変数へんすうです。 定数ていすうは、キーワード let使つかって宣言せんげんします。

定数ていすう宣言せんげん
let 定数ていすうめい: かた = しき
変数へんすう参照さんしょう
var a: Int = 47
print( a )
実行じっこう結果けっか
47

かた Int冒頭ぼうとう大文字おおもじでなければなりません。Swiftでは大文字おおもじ小文字こもじ区別くべつされます。

識別子しきべつし

定数ていすう変数へんすう名前なまえのことを識別子しきべつし( identifier )といます(ほかにも関数かんすう・メソッド・クラス・クラスのメンバーなどの名前なまえ識別子しきべつしで、おな名前なまえ空間くうかんなかでは識別子しきべつし重複じゅうふくできません)。

  • 識別子しきべつしには以下いか文字もじセットが使つかえます。
    • 英数字えいすうじ(a-z, A-Z, 0-9)
    • アンダースコア(_)
    • $ 記号きごう
    • Unicode文字もじ
  • 識別子しきべつし先頭せんとう数字すうじ(0-9)を使つかうことは出来できません。
  • var のようなSwiftのキーワードは識別子しきべつし使用しようできません。
  • print のような標準ひょうじゅんライブラリー関数かんすう識別子しきべつし使用しようすべきではありません。

この規則きそく違反いはんしたコードはコンパイルエラーになります。

標準ひょうじゅんライブラリー関数かんすう名前なまえ定数ていすう名前なまえ使つかった
let print = 0
print(print)
コンパイル結果けっか
main.swift:2:1: error: cannot call value of non-function type 'Int'
print(print)

ただし、識別子しきべつしを `(バッククオーテーション)でくくるとキーワードも識別子しきべつし使つかうことができます。

`(バッククオーテーション)でくくりキーワードを識別子しきべつし使つか
let `var` = 42
print(`var`)
実行じっこう結果けっか
42

初期しょき参照さんしょう

定数ていすう変数へんすう宣言せんげん初期しょき省略しょうりゃくできます
var a: Int
a = 31
print( a )

let b: Int
b = 42
print( b )
実行じっこう結果けっか
31
42

定数ていすう変数へんすう宣言せんげん初期しょき省略しょうりゃくできますが、初期しょき省略しょうりゃくした変数へんすう参照さんしょうするとコンパイルにエラーになります。

宣言せんげん初期しょき省略しょうりゃくした変数へんすう参照さんしょう(コンパイルにエラーになります)
var a: Int
print( a )
コンパイル結果けっか
main.swift:2:8: error: variable 'a' used before being initialized
print( a )
       ^

かた推論すいろん

初期しょきともなって変数へんすう定数ていすう宣言せんげんされた場合ばあいかたアノテーション(type annotation; : 型名かためい部分ぶぶん)を省略しょうりゃくすることができます。 これをかた推論すいろん( type inference )とびます。

かた推論すいろん
let a = 31
print( a, String(describing: type(of: a)) )

let b = "abc"
print( b, String(describing: type(of: b)) )

let c = 3.1415926536
print( c, String(describing: type(of: c)) )
実行じっこう結果けっか
31 Int
abc String
3.1415926536 Double
String(describing: type(of: しき)は、しきかた文字もじれつかえします。

一般いっぱん定数ていすう変数へんすう宣言せんげん初期しょきすることは習慣しゅうかんだとかんがえられています。このため、おおくのシチュエーションでかた推定すいてい可能かのうとなりがたアノテーションが省略しょうりゃくできます。

かたアノテーションを省略しょうりゃくすると、『コードの意図いとみにくくなる』とコードレビューで指摘してきされることがありますが、全部ぜんぶ宣言せんげんかたアノテーションを追加ついかすると、『かたアノテーションが冗長じょうちょう』とコードレビュー指摘してきされます。「どのような場合ばあいに、かたアノテーションをくべきか」一般いっぱんそくはありませんが let str = "abc"かたアノテーションをくべきだと主張しゅちょうするひとはまれなので、定数ていすう変数へんすう名前なまええらびは重要じゅうようで、たんabような「いろのない」 名前なまええらぶべきではありません。

暗黙あんもくかた変換へんかんおこなわれない

なお、いかなる数値すうちがた変数へんすうについても暗黙あんもくかた変換へんかん( implicit conversion )がおこなわれることはなく、かたちが数値すうち同士どうし演算えんざん右辺うへん左辺さへんかたことなる代入だいにゅうすべてコンパイルエラーとなります。

符号ふごう有無うむちが定数ていすうによる初期しょき
let signed: Int = 1
let unsigned: UInt = signed
コンパイル結果けっか
main.swift:2:22: error: cannot convert value of type 'Int' to specified type 'UInt'
let unsigned: UInt = signed
                     ^~~~~~
                     UInt( )
数値すうちリテラル1は、UIntの範囲はんいないですが swift はかた整合せいごう理由りゆうにエラーにします。
かたことなる定数ていすう数値すうちリテラルからなるしき
let signed: Int = 1
let number = signed + 1.0
コンパイル結果けっか
main.swift:2:8: error: binary operator '+' cannot be applied to operands of type 'Int' and 'Double'
signed + 1.0
~~~~~~ ^ ~~~
main.swift:2:8: note: overloads for '+' exist with these partially matching parameter lists: (Double, Double), (Int, Int)
signed + 1.0
       ^
かたことなる数値すうちリテラル同士どうしからなるしき
let number = 1 + 1.0
print( number, String(describing: type(of: number)) )
実行じっこう結果けっか
2.0 Double
これは暗黙あんもくかた変換へんかんていますが、数値すうちリテラルのみからなるしき(=コンパイル定数ていすうしき)で、コンパイル静的せいてき評価ひょうかされます。
Double.piは数値すうちリテラルあつかい?
let rad_to_deg_factor = Double.pi / 180
print( rad_to_deg_factor, String(describing: type(of: rad_to_deg_factor)) )
実行じっこう結果けっか
0.017453292519943295 Double
なぜ?

基本きほんデータがた

Swiftには、整数せいすう浮動ふどう小数点しょうすうてんすう真理しんりがた文字もじれつがたなどの基本きほんてきなデータがたがあります。これらのデータがたは、Swiftのプログラミングにおいて非常ひじょう重要じゅうよう役割やくわりたします。本稿ほんこうでは、Swiftの基本きほんデータがたについて、その特徴とくちょう使つかかたについて解説かいせつしていきます。

整数せいすう

以下いかはSwiftにおける整数せいすうとそのバリエーションとリテラルにかんするひょうです。

タイプ 範囲はんい おおきさ リテラルのれい
Int8

(符号ふごうき)

-128 〜 127 8ビット let myInt8: Int8 = -12
UInt8

(符号ふごうなし)

0 〜 255 8ビット let myUInt8: UInt8 = 42
Int16

(符号ふごうき)

-32,768 〜 32,767 16ビット let myInt16: Int16 = -1234
UInt16

(符号ふごうなし)

0 〜 65,535 16ビット let myUInt16: UInt16 = 5678
Int32

(符号ふごうき)

-2,147,483,648 〜 2,147,483,647 32ビット let myInt32: Int32 = -123456
UInt32

(符号ふごうなし)

0 〜 4,294,967,295 32ビット let myUInt32: UInt32 = 123456
Int64

(符号ふごうき)

-9,223,372,036,854,775,808 〜 9,223,372,036,854,775,807 64ビット let myInt64: Int64 = -1234567890
UInt64

(符号ふごうなし)

0 〜 18,446,744,073,709,551,615 64ビット let myUInt64: UInt64 = 1234567890
Int

(符号ふごうき)

-2,147,483,648 〜 2,147,483,647

(32ビット または 64ビット)

32ビットまたは64ビット

環境かんきょうによる)

let myInt: Int = -1234567890
UInt

(符号ふごうなし)

0 〜 4,294,967,295

(32ビット または 64ビット)

32ビットまたは64ビット

環境かんきょうによる)

let myUInt: UInt = 1234567890

Swiftには、整数せいすうのリテラルに使用しようできるおおくのオプションがあります。以下いかに、Swiftで使用しようできる整数せいすうのリテラル構文こうぶんれいしめします。

let decimalInt = 17 // 10進数しんすう
let binaryInt = 0b10001 // 2進数しんすう
let octalInt = 0o21 // 8進数しんすう
let hexInt = 0x11 // 16進数しんすう

これらのリテラルのまえには、マイナス記号きごう使用しようして、まけ整数せいすうあらわすことができます。また、アンダースコア(_)を使用しようして、リテラルのみやすさを向上こうじょうさせることができます。

浮動ふどう小数点しょうすうてんすう

以下いかはSwiftの浮動ふどう小数点しょうすうてんすうとそのバリエーション、およびリテラルのひょうです。

データがた ビット 最小さいしょう 最大さいだい リテラル
Float 32 1.175494e-38 3.402823e+38 3.14, 0.1e2, 1.25E-2
Double 64 2.2250738585072014e-308 1.7976931348623157e+308 3.14, 0.1e2, 1.25E-2
Float80 80 3.36210314311209350626e-4932 1.18973149535723176505e+4932 3.14, 0.1e2, 1.25E-2

以下いかはSwiftのコードれいです。

let a: Float = 3.14
let b: Double = 0.1e2
let c: Float80 = 1.25E-2

print(a) // 3.14
print(b) // 10.0
print(c) // 0.0125

真理しんり

Swiftでは、しんあらわすのにtrue、にせあらわすのにfalseを使用しようします。これらは、Boolというデータがたです。たとえば、以下いかのように使用しようします。

let happy: Bool = true
let hungry = false
print(happy) // true
print(hungry) // false

文字もじ文字もじれつ

以下いかはSwiftで使用しよう可能かのう文字もじがた、バリエーション、およびリテラルのひょうです:

かた バリエーション リテラルのれい
Character Unicodeスカラー "A"
String Unicodeスカラーまたは文字もじれつ "Hello, world!"

こちらはSwiftでの文字もじがた実際じっさいのコードれいです:

let letterA: Character = "A"
let message: String = "Hello, world!"

文字もじれつ文字もじれつ連結れんけつ

以下いかはSwiftの文字もじれつ文字もじれつ連結れんけつ方法ほうほうです。まず、+演算えんざん使用しようして文字もじれつ連結れんけつすることができます。

let str1 = "Hello"
let str2 = "world"
let str3 = str1 + " " + str2
print(str3) // "Hello world"

また、+=演算えんざん使用しようして文字もじれつ更新こうしんすることもできます。

var str4 = "Hello"
str4 += " world"
print(str4) // "Hello world"
var str4 = "Hello"
str4 += " world"
print(str4) // "Hello world"

文字もじれつ方法ほうほう

以下いかは、Swiftで文字もじれつ方法ほうほうれいです。\(value)のように、文字もじれつない変数へんすうを\( )でかこんでみます。

var name = "John"
var age = 25
var message = "\(name) is \(age) years old."

print(message)
実行じっこう結果けっか
John is 25 years old.

また、String(format: "%@", value)のように、Stringクラスのformatメソッドを使用しようすることもできます。以下いかれいです。

var name = "John"
var age = 25
var message = String(format: "%@ is %d years old.", name, age)

print(message)
実行じっこう結果けっか
John is 25 years old.

どちらの方法ほうほうでもおな結果けっかられます。

サロゲートペア

このSwiftのコードは、文字もじれつをUTF-8形式けいしきおよびUTF-16形式けいしきでそれぞれカウントする方法ほうほうと、文字もじれつちょう計算けいさんする方法ほうほうしめしています。

import Foundation // Foundationフレームワークをインポート

let str = "aαあるふぁあ𪚲" // 文字もじれつ定義ていぎ(ASCII, ギリシャ文字もじ, ひらがな, 片仮名かたかな, および漢字かんじとうふくむ)
print(str.utf8.count) // UTF-8形式けいしきでの文字もじれつながさをカウント(バイト単位たんい):10
print(str.utf16.count) // UTF-16形式けいしきでの文字もじれつながさをカウント(16ビット単位たんい):5
print((str as NSString).length) // UTF-16形式けいしきでの文字もじれつながさを計算けいさん:5
print(str._bridgeToObjectiveC().length) // うえ同様どうようにUTF-16形式けいしきでの文字もじれつながさを計算けいさん:5

let char = str.character(at:3) // 4番目ばんめ文字もじのUnicode scalarをつける
print(type(of: char)) // UInt16(16ビット符号ふごうなし整数せいすうがた
print(String(format:"%x", char)) // d869(4番目ばんめ文字もじのUnicode scalarを16進数しんすう表記ひょうき出力しゅつりょく

このコードでは、Foundationフレームワークがインポートされているため、NSStringのメソッドであるlengthメソッドにアクセスできます。 また、character(at:)NSStringにも実装じっそうされていますが、SwiftみのStringかたでも提供ていきょうされています。

配列はいれつ

Swiftにおける配列はいれつは、複数ふくすういち箇所かしょ保持ほじすることができるデータ構造こうぞうです。Swiftでは、配列はいれつ宣言せんげんするために2つの方法ほうほうがあります。以下いかひょうでは、それぞれの方法ほうほうについて解説かいせつします。

配列はいれつ宣言せんげん方法ほうほう 説明せつめい
Array<要素ようそかた>() そら配列はいれつ定義ていぎする方法ほうほうです。
[要素ようそかた]() そら配列はいれつ定義ていぎする省略形しょうりゃくけいです。

以下いかは、Swiftにおける配列はいれつのバリエーションとリテラルのコードれいです。

そら配列はいれつ定義ていぎする場合ばあい

var emptyArray: Array<Int> = Array<Int>()
var emptyArray2: [Int] = [Int]()
var emptyArray3: [Int] = []

ここで、Array<Int>()[Int]()は、そら配列はいれつ宣言せんげんするための方法ほうほうで、それぞれemptyArrayemptyArray2てられます。同様どうように、[]そら配列はいれつ宣言せんげんする省略形しょうりゃくけいで、emptyArray3てられます。

配列はいれつのリテラルを使用しようする場合ばあい

var arrayWithLiteral1: [Int] = [1, 2, 3]
var arrayWithLiteral2 = [4, 5, 6]

ここで、[1, 2, 3][4, 5, 6]は、配列はいれつのリテラルとばれるもので、それぞれarrayWithLiteral1arrayWithLiteral2てられます。

配列はいれつにアクセスする方法ほうほう

var fruits = ["apple", "banana", "orange"]
print(fruits[0]) // "apple"
print(fruits[1]) // "banana"
print(fruits[2]) // "orange"

配列はいれつには、かく要素ようそ対応たいおうするインデックスがあります。うえれいでは、fruits最初さいしょ要素ようそにアクセスするには、fruits[0]きます。インデックスは0からはじまり、配列はいれつ最後さいご要素ようそにアクセスするインデックスは(配列はいれつ要素ようそすう - 1)となります。

配列はいれつ結合けつごう

+演算えんざん使つかった配列はいれつ結合けつごう

+演算えんざん使つかうと、2つの配列はいれつ結合けつごうすることができます。たとえば、以下いかのようにくことができます。

let array1 = [1, 2, 3]
let array2 = [4, 5, 6]
let joinedArray = array1 + array2
print(joinedArray) // => [1, 2, 3, 4, 5, 6]
+=演算えんざん使つかった配列はいれつ結合けつごう

+=演算えんざん使つかうと、配列はいれつ自身じしん変更へんこうして結合けつごうすることができます。たとえば、以下いかのようにくことができます。

var array3 = [7, 8, 9]
array3 += [10, 11, 12]
print(array3) // => [7, 8, 9, 10, 11, 12]

配列はいれつ代入だいにゅう

Swiftの配列はいれつがたであるため、代入だいにゅうする場合ばあいにはコピーが作成さくせいされます。つまり、もと配列はいれつ影響えいきょうあたえずにべつ配列はいれつ代入だいにゅうすることができます。たとえば、以下いかのようにくことができます。

var array4 = [13, 14, 15]
var array5 = array4
array5.append(16)
print(array4) // => [13, 14, 15]
print(array5) // => [13, 14, 15, 16]

ただし、配列はいれつない要素ようそ参照さんしょうがたである場合ばあいは、代入だいにゅうさき配列はいれつでもおなじオブジェクトが参照さんしょうされるため、もと配列はいれつ要素ようそ変更へんこうくわえた場合ばあいには代入だいにゅうさき配列はいれつにもおな変更へんこう反映はんえいされます。

基本きほん操作そうさ

var arr = [0, 1, 2, 3, 4, 5, 6]
arr.append(7)
print(arr) // [0, 1, 2, 3, 4, 5, 6, 7]

arr += [8, 9, 10]
print(arr) // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

arr.insert(11, at:2)
print(arr) // [0, 1, 11, 2, 3, 4, 5, 6, 7, 8, 9, 10]

arr[2] = 12
print(arr) // [0, 1, 12, 2, 3, 4, 5, 6, 7, 8, 9, 10]

arr[2...2] = [11, 12, 13]
print(arr) // [0, 1, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9, 10]

arr.remove(at:0)
print(arr) // [1, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9, 10]

arr.removeLast()
print(arr) // [1, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9]

arr[5...] = [99]
print(arr) // [1, 11, 12, 13, 2, 99]

let index13 = arr.index(of: 13)
print(index13) // Optional(3)

let squared = arr.map{ i in i * i }
print(squared) // [1, 121, 144, 169, 4, 9801]

let filtered = arr.filter{ n in n > 3 }
print(filtered) // [11, 12, 13, 99]

let sorted = arr.sorted{ (a, b) in a > b }
print(sorted) // [99, 13, 12, 11, 2, 1]

let sum = arr.reduce(0){ (s, n) in s + n }
print(sum) // 138

arr.forEach{ n in print(n) } // 1↵121↵144↵169↵4↵9801

let arr1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

let arr1_1 = arr1.map{ a -> [Int] in a.reversed() }
print(arr1_1) // [[3, 2, 1], [6, 5, 4], [9, 8, 7]]

let arr1_2 = arr1.flatMap{ a -> [Int] in a.reversed() }
print(arr1_2) // [3, 2, 1, 6, 5, 4, 9, 8, 7]

let arr2 = [1, 2, nil, 4]

let arr2_1 = arr2.map{ n -> Int? in n }
print(arr2_1) // [Optional(1), Optional(2), nil, Optional(4)]

let arr2_2 = arr2.flatMap{ n -> Int? in n }
print(arr2_2) // [1, 2, 4]

このコードは、Swift言語げんご配列はいれつたいしておこなうことができるいくつかの操作そうさしめしています。

最初さいしょに、配列はいれつ要素ようそ追加ついかする方法ほうほうしめされています。append()メソッドは、配列はいれつ末尾まつび要素ようそ追加ついかします。+=演算えんざんは、べつ配列はいれつ末尾まつび追加ついかすることもできます。

つぎに、配列はいれつない要素ようそ挿入そうにゅうしたり、えたり、削除さくじょしたりする方法ほうほうしめされています。insert()メソッドは、特定とくてい位置いち要素ようそ挿入そうにゅうします。要素ようそえるには、要素ようそのインデックスを指定していしててます。remove()メソッドは、指定していしたインデックスの要素ようそ削除さくじょします。removeLast()メソッドは、配列はいれつ末尾まつび要素ようそ削除さくじょします。また、配列はいれつスライスを使用しようして、複数ふくすう要素ようそいちえることもできます。

つぎに、配列はいれつ操作そうさしてあたらしい配列はいれつ作成さくせいする方法ほうほうしめされています。map()メソッドは、配列はいれつないのすべての要素ようそたいして関数かんすう適用てきようし、あたらしい配列はいれつかえします。filter()メソッドは、配列はいれつない要素ようそをフィルタリングし、指定していした条件じょうけんたす要素ようそだけをふくあたらしい配列はいれつかえします。sorted()メソッドは、配列はいれつない要素ようそをソートし、あたらしい配列はいれつかえします。reduce()メソッドは、配列はいれつない要素ようそたたんで単一たんいつかえします。forEach()メソッドは、配列はいれつないのすべての要素ようそたいして、指定していされたクロージャを実行じっこうします。

最後さいごに、多次元たじげん配列はいれつたいして操作そうさおこな方法ほうほうしめされています。map()メソッドは、多次元たじげん配列はいれつないのすべての配列はいれつたいして、それぞれの要素ようそ順序じゅんじょ反転はんてんしたあたらしい配列はいれつかえします。flatMap()メソッドは、多次元たじげん配列はいれつないのすべての要素ようそを1つの配列はいれつ平坦へいたんします。また、オプショナルがたふく配列はいれつたいしても動作どうさします。map()メソッドはオプショナルがたふく配列はいれつたいしては動作どうさしますが、flatMap()メソッドはnil削除さくじょしてあたらしい配列はいれつかえします。

集合しゅうごう

Swiftの集合しゅうごう(Set)は、ユニークで順序じゅんじょがない要素ようそのコレクションです。それぞれの要素ようそおながたでなければなりません。重複じゅうふくした要素ようそは1つの要素ようそとしてあつかわれます。

以下いかは、Swiftの集合しゅうごうかんする基本きほんてき機能きのうれいです。

// そら集合しゅうごう作成さくせいする
var setA = Set<Int>()
print(setA) // []

// 初期しょき指定していして集合しゅうごう作成さくせいする
var setB: Set<Int> = [1, 2, 3]
print(setB) // [1, 2, 3]

// 集合しゅうごう要素ようそ追加ついかする
setA.insert(1)
setA.insert(2)
setA.insert(3)
setA.insert(4)
print(setA) // [1, 2, 3, 4]

// 集合しゅうごうから要素ようそ削除さくじょする
setA.remove(3)
print(setA) // [1, 2, 4]

// 集合しゅうごう要素ようそすう取得しゅとくする
print(setA.count) // 3

// 集合しゅうごう要素ようそふくまれているかを調しらべる
print(setA.contains(1)) // true
print(setA.contains(3)) // false

// 集合しゅうごうそらにする
setA.removeAll()
print(setA) // []

// 集合しゅうごう演算えんざん
let set1: Set<Int> = [1, 2, 3, 4]
let set2: Set<Int> = [3, 4, 5, 6]

// 集合しゅうごう取得しゅとくする
let unionSet = set1.union(set2)
print(unionSet) // [1, 2, 3, 4, 5, 6]

// せき集合しゅうごう取得しゅとくする
let intersectionSet = set1.intersection(set2)
print(intersectionSet) // [3, 4]

// 集合しゅうごう取得しゅとくする
let subtractingSet = set1.subtracting(set2)
print(subtractingSet) // [1, 2]

// 対称たいしょう集合しゅうごう取得しゅとくする
let symmetricDifferenceSet = set1.symmetricDifference(set2)
print(symmetricDifferenceSet) // [1, 2, 5, 6]

Swiftの集合しゅうごう(Set)には、forループや高階たかしな関数かんすう使用しようして要素ようそ処理しょりすることができます。

まず、forループを使用しようする場合ばあいは、つぎのように記述きじゅつします。

let set: Set = ["apple", "orange", "banana"]

for element in set {
    print(element)
}
// apple
// orange
// banana

このれいでは、Set要素ようそfor-inループで1つずつし、それぞれの要素ようそ処理しょりしています。

つぎに、高階たかしな関数かんすう使用しようする場合ばあいは、map()filter()reduce()のような関数かんすう使用しようできます。

たとえば、map()関数かんすう使用しようして、Setかく要素ようそたいして操作そうさおこない、あたらしいSet作成さくせいすることができます。

let set: Set = [1, 2, 3, 4, 5]

let mappedSet = set.map { $0 * 2 }

print(mappedSet) // [2, 4, 10, 8, 6]

このれいでは、Setかく要素ようそを2ばいして、あたらしいSet作成さくせいしています。map()関数かんすうは、クロージャーを引数ひきすうとしてり、そのクロージャーでSetかく要素ようそ操作そうさしています。

また、filter()関数かんすう使用しようして、Set要素ようそをフィルタリングすることができます。

let set: Set = [1, 2, 3, 4, 5]

let filteredSet = set.filter { $0 % 2 == 0 }

print(filteredSet) // [4, 2]

このれいでは、Set要素ようそを2でったあまりが0のものだけをし、あたらしいSet作成さくせいしています。

最後さいごに、reduce()関数かんすう使用しようして、Set要素ようそたたむことができます。

let set: Set = [1, 2, 3, 4, 5]

let sum = set.reduce(0) { $0 + $1 }

print(sum) // 15

このれいでは、Setかく要素ようそ合計ごうけいしています。reduce()関数かんすうは、初期しょきとクロージャーを引数ひきすうとしてり、Setかく要素ようそたたんで、1つの生成せいせいしています。

辞書じしょ

Swiftの辞書じしょ(Dictionary)は、キーとのペアを保存ほぞんするためのコレクションです。キーとはそれぞれことなるデータがたである必要ひつようがあります。辞書じしょは、取得しゅとくするためのキーを使用しようしてアクセスできます。

辞書じしょは、以下いかのように宣言せんげんされます。

var dict: [KeyType: ValueType] = [KeyType: ValueType]()

ここで、KeyTypeはキーのデータがたあらわし、ValueTypeはのデータがたあらわします。たとえば、文字もじれつをキーに整数せいすう辞書じしょ以下いかのように宣言せんげんできます。

var numberDict: [String: Int] = ["one": 1, "two": 2, "three": 3]

辞書じしょ要素ようそにアクセスするには、キーを使用しようします。

print(numberDict["one"]) // Optional(1)
print(numberDict["four"]) // nil

存在そんざいしないキーにアクセスすると、nilがかえされます。辞書じしょにキーが存在そんざいするかどうかを確認かくにんするには、containsメソッドを使用しようします。

if numberDict.contains(where: { $0.key == "one" }) {
    print("Key exists")
} else {
    print("Key does not exist")
}

辞書じしょ要素ようそ追加ついかするには、あたらしいキーとのペアを辞書じしょ追加ついかします。

numberDict["four"] = 4

辞書じしょから要素ようそ削除さくじょするには、キーを指定していしてremoveValue(forKey:)メソッドを使用しようします。

numberDict.removeValue(forKey: "four")

辞書じしょ要素ようそ変更へんこうするには、あたらしいをキーにてます。

numberDict["one"] = 10

辞書じしょのキーと反復はんぷく処理しょりするには、for-inループを使用しようします。

for (key, value) in numberDict {
    print("\(key): \(value)")
}

辞書じしょのキーを反復はんぷく処理しょりするには、keysプロパティを使用しようします。

for key in numberDict.keys {
    print(key)
}

辞書じしょ反復はんぷく処理しょりするには、valuesプロパティを使用しようします。

for value in numberDict.values {
    print(value)
}

辞書じしょにも、配列はいれつ集合しゅうごう同様どうようmapfilterreduce などの高階たかしな関数かんすう使用しようできます。

map辞書じしょかく要素ようそたいして、変換へんかん処理しょり適用てきようし、あたらしい辞書じしょ作成さくせいするメソッドです。変換へんかん処理しょりは、クロージャーの引数ひきすうとして、かく要素ようそ(key, value) のタプルをります。以下いかは、辞書じしょ dictかく要素ようそを2ばいにしたあたらしい辞書じしょ作成さくせいするれいです。

let dict = ["a": 1, "b": 2, "c": 3]
let doubled = dict.map { (key, value) in (key, value * 2) }
print(doubled) // ["a": 2, "b": 4, "c": 6]

filter辞書じしょかく要素ようそたいして、指定していした条件じょうけんたす要素ようそだけを抽出ちゅうしゅつして、あたらしい辞書じしょ作成さくせいするメソッドです。条件じょうけんは、クロージャーの引数ひきすうとして、かく要素ようそ(key, value) のタプルをり、条件じょうけんしきかえします。以下いかは、奇数きすう要素ようそだけを抽出ちゅうしゅつしたあたらしい辞書じしょ作成さくせいするれいです。

let dict = ["a": 1, "b": 2, "c": 3]
let oddValues = dict.filter { (key, value) in value % 2 != 0 }
print(oddValues) // ["a": 1, "c": 3]

reduce辞書じしょかく要素ようそたたんで、1つの生成せいせいするメソッドです。初期しょきと、たた処理しょりをクロージャーの引数ひきすうとしてわたします。たた処理しょりは、初期しょきかく要素ようそ(key, value) のタプルを引数ひきすうとしてり、あたらしいかえします。以下いかは、辞書じしょ dictぜん要素ようそもとめるれいです。

let dict = ["a": 1, "b": 2, "c": 3]
let sum = dict.reduce(0) { (result, keyValue) in
    let (_, value) = keyValue
    return result + value
}
print(sum) // 6

タプル

Swiftのタプルは、複数ふくすうことなるデータがたひとつのグループにまとめることができます。タプルは、複数ふくすうかえすときにも便利べんりです。

以下いかは、タプルのれいです。

let myTuple = ("apple", 3.14, true)
print(myTuple) // 出力しゅつりょく: ("apple", 3.14, true)

タプルには、複数ふくすう要素ようそをカンマ区切くぎりで指定していし、まる括弧かっこかこみます。

タプルのかく要素ようそは、インデックスを指定していしてアクセスすることができます。

let myTuple = ("apple", 3.14, true)
print(myTuple.0) // 出力しゅつりょく: apple
print(myTuple.1) // 出力しゅつりょく: 3.14
print(myTuple.2) // 出力しゅつりょく: true

また、タプルのかく要素ようそ名前なまえけることもできます。

let myTuple = (name: "apple", price: 100, isOnSale: true)
print(myTuple.name)     // 出力しゅつりょく: apple
print(myTuple.price)    // 出力しゅつりょく: 100
print(myTuple.isOnSale) // 出力しゅつりょく: true

タプルは、関数かんすうもどとしても利用りようできます。複数ふくすうかえ場合ばあい、タプルを使つかうとコードを簡潔かんけつ記述きじゅつすることができます。

func findMinMax(array: [Int]) -> (min: Int, max: Int) {
    var min = array[0]
    var max = array[0]
  
    for value in array {
        if value < min {
            min = value
        }
        if value > max {
            max = value
        }
    }
  
    return (min, max)
}

let result = findMinMax(array: [3, 5, 2, 8, 1])
print("最小さいしょう: \(result.min), 最大さいだい: \(result.max)") // 出力しゅつりょく: 最小さいしょう: 1, 最大さいだい: 8

このれいでは、findMinMax関数かんすうがタプルをかえし、そのタプルには、最小さいしょう最大さいだいふくまれます。もどったresultは、タプルであるため、.min.max使つかって取得しゅとくすることができます。

オプショナルがた

Swiftにおけるオプショナル(Optional)は、存在そんざいする場合ばあいにはそのち、存在そんざいしない場合ばあいにはnilという特殊とくしゅかたです。つまり、オプショナルは存在そんざいしない表現ひょうげんするためのかたです。

たとえば、Intかた変数へんすうx宣言せんげんしたとき、その初期しょきnilとなります。

var x: Int?

このようにオプショナルを使つかうことで、変数へんすうはいるまでかためずに宣言せんげんすることができます。

オプショナルのにアクセスするには、アンラップ(unwrapping)が必要ひつようです。アンラップとは、オプショナルのnilでないことを確認かくにんしてから、にアクセスすることです。

以下いかは、オプショナルのにアクセスする方法ほうほうれいです。

var optionalInt: Int? = 10

// optionalIntがnilでないことを確認かくにんしてからアクセスする
if let unwrappedInt = optionalInt {
    print(unwrappedInt)
}

// 強制きょうせいてきにアンラップする
let unwrappedInt2 = optionalInt!
print(unwrappedInt2)

上記じょうきれいでは、オプショナルがた変数へんすうoptionalInt10代入だいにゅうしています。そのif letぶんoptionalIntnilでないことを確認かくにんし、unwrappedIntにアンラップした代入だいにゅうしています。また、!演算えんざん使つかって強制きょうせいてきにアンラップすることもできます。ただし、optionalIntnilである場合ばあいにはランタイムエラーが発生はっせいします。

また、オプショナルがたには、guard letぶん使つかってもアンラップすることができます。

func foo(optionalStr: String?) {
    guard let unwrappedStr = optionalStr else {
        print("optionalStr is nil")
        return
    }
    print(unwrappedStr)
}

foo(optionalStr: "Hello, world!") // Hello, world!
foo(optionalStr: nil) // optionalStr is nil

このれいでは、foo関数かんすう引数ひきすうoptionalStrnilでない場合ばあいには、unwrappedStrにアンラップされた使つかって処理しょりおこない、nilである場合ばあいにはguardぶんなか処理しょりおこなっています。

オプショナルがたには、Null合体がったい演算えんざん( Nil-Coalescing Operator )??使用しようして、オプショナルのがnilである場合ばあいに、デフォルトかえすこともできます。

var optionalStr: String? = nil
let unwrappedStr = optionalStr ?? ""
オプショナル連鎖れんさ

Swiftにおいて、オプショナルのたいして簡潔かんけつかつ安全あんぜんにアクセスする方法ほうほうの1つに、「オプショナル連鎖れんさ (Optional chaining)」があります。

オプショナル連鎖れんさは、オプショナルのプロパティにアクセスするさい使用しようする「?」を使つかって、プロパティの存在そんざい確認かくにんしながらアクセスをおこなうことができます。オプショナル連鎖れんさ適用てきようされたしきは、オプショナルとして評価ひょうかされます。

以下いかは、オプショナル連鎖れんされいです。

struct Person {
    var name: String
    var age: Int?
}

let person: Person? = Person(name: "John", age: 30)

// オプショナル連鎖れんさ使用しようせずにageにアクセスすると、コンパイルエラーになる
// let age = person.age 

// オプショナル連鎖れんさ使用しようしてageにアクセスする
let age = person?.age
print(age) // Optional(30)

上記じょうきれいでは、personPersonかたのオプショナルであり、そのageプロパティもオプショナルです。let age = person?.ageとすることで、personnilでない場合ばあいかぎり、ageにアクセスされます。ageかたは、Int?となります。

また、オプショナル連鎖れんさは、プロパティだけでなくメソッドやサブスクリプトにも適用てきようすることができます。以下いかは、オプショナル連鎖れんさ使用しようしたメソッドのれいです。

struct Car {
    var name: String
    func drive() {
        print("\(name) is driving.")
    }
}

var car: Car? = Car(name: "Tesla")

// オプショナル連鎖れんさ使用しようしてdriveメソッドにアクセスする
car?.drive() // "Tesla is driving."

car = nil

// オプショナル連鎖れんさ使用しようしてdriveメソッドにアクセスする
car?.drive() // なに出力しゅつりょくされない

上記じょうきれいでは、carCarかたのオプショナルです。car?.drive()とすることで、carnilでない場合ばあいかぎり、driveメソッドが実行じっこうされます。

オプショナル連鎖れんさ利用りようにより、アンラップ処理しょり簡潔かんけつかつ安全あんぜんおこなうことができます。 ただし、オプショナル使用しようする場合ばあいは、存在そんざいしない場合ばあいそなえたハンドリングをおこなうことが重要じゅうようです。

演算えんざん

Swiftにおいて、しきはプログラムでなにかしらの生成せいせいするための構成こうせい要素ようそです。しきは、変数へんすうやリテラル、関数かんすうし、演算えんざん、そしてそれらをわせたものから構成こうせいされます。

演算えんざんは、式内しきない操作そうさするために使用しようされます。 Swiftには、算術さんじゅつ演算えんざん比較ひかく演算えんざん論理ろんり演算えんざん代入だいにゅう演算えんざん範囲はんい演算えんざん、ビット演算えんざんなど、さまざまな種類しゅるい演算えんざんがあります。演算えんざんは、変数へんすう定数ていすう、リテラルなどのオペランドにたいして、特定とくてい操作そうさ実行じっこうするために使用しようされます。

演算えんざんは、一般いっぱんてきに、単項たんこう演算えんざん(1つのオペランドをる)、こう演算えんざん(2つのオペランドをる)またはさんこう演算えんざん(3つのオペランドをる)に分類ぶんるいされます。Swiftでは、いくつかの演算えんざんは、オプショナルや範囲はんい、タプルなどの機能きのうとくしています。

このセクションでは、Swiftで使用しようできる演算えんざんについてくわしく説明せつめいします。演算えんざん優先ゆうせん順位じゅんい結合けつごうせい、および使用しようれいしめし、適切てきせつ演算えんざん使用しようしてしきてる方法ほうほう紹介しょうかいします。

算術さんじゅつ演算えんざん

こう演算えんざん
文法ぶんぽう 意味いみ
+ 加算かさん
- 減算げんざん
* 乗算じょうざん
/ 除算じょざん整数せいすうがたのゼロ除算じょざんはエラーとなります)
% 剰余じょうよ整数せいすうがたのゼロでの剰余じょうよ演算えんざんはエラーとなります)
&+ 加算かさん(オーバーフローを無視むしします)
&- 減算げんざん(オーバーフローを無視むしします)
&* 乗算じょうざん(オーバーフローを無視むしします)
&/ 除算じょざん(オーバーフローを無視むしし、ゼロ除算じょざん結果けっか0となります)(※廃止はいしみ)
&% 剰余じょうよ(オーバーフローを無視むしし、ゼロでの剰余じょうよ演算えんざん結果けっか0となります)(※廃止はいしみ)
単項たんこう演算えんざんぜんおけ
文法ぶんぽう 意味いみ
+ 単項たんこうプラス
- 単項たんこうマイナス(符号ふごう反転はんてん
++ インクリメント(しきはインクリメントされたのちかえす)※Swift 3.0で廃止はいし[2]
-- デクリメント(しきはデクリメントされたのちかえす)※Swift 3.0で廃止はいし[2]
単項たんこう演算えんざんおけ
文法ぶんぽう 意味いみ
++ インクリメント(しきはインクリメントされるまえかえす)※Swift 3.0で廃止はいし[2]
-- デクリメント(しきはデクリメントされるまえかえす)※Swift 3.0で廃止はいし[2]

比較ひかく演算えんざん

比較ひかく演算えんざん
文法ぶんぽう 意味いみ
< よりちいさい
<= 以下いか
> よりおおきい
>= 以上いじょう
文法ぶんぽう 意味いみ
== ひとしい
!= ひとしくない
=== おなじオブジェクトへの参照さんしょう
!== べつのオブジェクトへの参照さんしょう
文法ぶんぽう 意味いみ
~= パターンマッチ(左辺さへん範囲はんいない右辺うへんればtrue)
print(1...5 ~= 3) // true
var str = "mission control"
print(str.range(of: "control")! ~= str.index(of: "c")!) // true

論理ろんり演算えんざん

論理ろんり演算えんざん
文法ぶんぽう 意味いみ
&& 論理ろんりAND
|| 論理ろんりOR
! 論理ろんりNOT

さんこう演算えんざん

さんこう演算えんざん
文法ぶんぽう 意味いみ
条件じょうけん ? しき1 : しき2 条件じょうけんしんのときしき1を、にせのときしき2かえ

nil結合けつごう演算えんざん

nil結合けつごう演算えんざん( Nil Coalescing Operator )
文法ぶんぽう 意味いみ
?? ひだりオペランドにはT?かたみぎオペランドにはTかたをとり、
ひだりオペランドに存在そんざいしていればアンラップしてそのかえし、ひだりオペランドがnilであればみぎオペランドのかえ
"x".toInt() ?? 0  // 0
"5".toInt() ?? 0  // 5

ビット演算えんざん

ビット演算えんざん
文法ぶんぽう 意味いみ
<< ひだりシフト
>> みぎシフト(ひだりオペランドが符号ふごう整数せいすう場合ばあい算術さんじゅつシフト、符号ふごう整数せいすう場合ばあい論理ろんりシフト)
& AND
| OR
^ XOR
~ NOT(ビット反転はんてん

代入だいにゅう演算えんざん

代入だいにゅう演算えんざん
文法ぶんぽう 意味いみ
= 代入だいにゅう
+= 加算かさん代入だいにゅう
-= 減算げんざん代入だいにゅう
*= 乗算じょうざん代入だいにゅう
%= 剰余じょうよ演算えんざん代入だいにゅう
/= 除算じょざん代入だいにゅう
文法ぶんぽう 意味いみ
<<= ひだりビットシフトと代入だいにゅう
>>= みぎビットシフトと代入だいにゅう
&= ビット演算えんざんANDと代入だいにゅう
^= ビット演算えんざんXORと代入だいにゅう
|= ビット演算えんざんORと代入だいにゅう
&&= 論理ろんりANDと代入だいにゅう
||= 論理ろんりORと代入だいにゅう

範囲はんい演算えんざん

範囲はんい演算えんざん( Range operators )
文法ぶんぽう 意味いみ
..< 半分はんぶんひらいた範囲はんい終端しゅうたんふくまない):半開はんかい区間くかん
... じた範囲はんい終端しゅうたんふく):閉区あいだ

キャスト演算えんざん

キャスト演算えんざん
文法ぶんぽう 意味いみ
is かた検査けんさ
as かたキャスト
as? オプショナルがたへのキャスト キャストできない場合ばあいはnilとなる
as! 強制きょうせいがたキャスト キャストできない場合ばあい実行じっこうエラーとなる
キャスト演算えんざん
var arr:[Any] = [1, 2.0, "3", -4]

for item in arr {
  let intItem = item as? Int
  print(intItem)
}
実行じっこう結果けっか
Optional(1)
nil
nil
Optional(-4)
import Foundation

var array1 = [1, 2, 3, 4] as NSArray
var mutableArray1 = array1 as? NSMutableArray // ダウンキャストできないので、nilになる
// ※補足ほそく: 上記じょうきれい場合ばあい、Mutableな状態じょうたい取得しゅとくしたければ array1.mutableCopy() をおこなうべき。

var mutableArray2 = [1, 2, 3, 4] as NSMutableArray
var array2 = mutableArray2 as NSArray
var mutableArray2_2 = array2 as? NSMutableArray // 元々もともとmutableArray2のかたはNSMutableArrayなので、キャストに成功せいこうする

その

識別子しきべつしにはUnicode文字もじもちいることができます。

let リンゴのかず = 3
let みかんのかず = 5

文字もじれつリテラルのなかにある\(...)には、しき結果けっか展開てんかいされる

let リンゴ説明せつめい = "わたし\(リンゴのかず)のリンゴをっています。"  // ”わたしは3のリンゴをっています。"
let 果物くだもの説明せつめい = "わたし\(リンゴのかず + みかんのかず)果物くだものっています。" //"わたしは8果物くだものっています。"

ヒアドキュメントには、ダブルクォーテーション3つを使用しようします。ヒアドキュメントない行頭ぎょうとう空白くうはく自動的じどうてきにトリミングされます。

let tanka = """
            田子たごうら
            うちでてみれば
            白妙しろたえ
            富士ふじ高嶺たかね
            ゆきりつつ
            """
print(tanka)

数値すうちリテラルのプレフィックスは"0b"で2進数しんすう、"0o"で8進数しんすう、"0x"で16進数しんすうあらわす。

let dec = 29
let bin = 0b11101  // 2進数しんすうで29
let oct = 0o35     // 8進数しんすうで29
let hex = 0x1D     // 16進数しんすうで29

浮動ふどう小数点しょうすうてんリテラルは、通常つうじょうじゅう進数しんすう表記ひょうきくわえ16進数しんすう表記ひょうきもサポートしています。

let πぱい = 3.1415926535897931
let pi = 0x1.921fb54442d18p+1 // NSString(format:"%a", πぱい) の出力しゅつりょく同様どうよう

整数せいすうがた浮動ふどう小数点しょうすうてんがたのどちらでも、コードのやすさのためにアンダースコア _けた区切くぎりとして挿入そうにゅうできます。

let threeHundledMillion = 300_000_000
let bitMask: UInt8 = 0b0010_0000

アンダースコアは、代入だいにゅうぶん代入だいにゅうする無視むししたいときに、かり代入だいにゅうさきとして使用しようできます。

var s:String? = "String"
if let _ = s {
    print("sはnilではありません。")
}
for _ in 0..<5 {
    print("repeat")
}
let result = (404, "Not Found", false)
let (_, message, _) = result

言語げんごとの比較ひかく

C言語げんごとの類似るいじてん

  • ほとんどのC言語げんご演算えんざんはSwiftでも使用しようできます。
    • ただし、Swiftではオーバーフローをともな数値すうち演算えんざんのサポートのための演算えんざん追加ついかされています。
  • ちゅう括弧かっこは、ぶんをグループするために使用しようされます。
  • 等号とうごう1つ=代入だいにゅう、2つ==等価とうか比較ひかく意味いみします。
    • このほかに、Swiftでは等号とうごう3つ===おなじオブジェクトを参照さんしょうしているかどうかを確認かくにんするための演算えんざん意味いみします。
  • whileifforひとし制御せいぎょぶん類似るいじしています。
    • ただし、Swiftでは拡張かくちょう機能きのうゆうします。たとえば、whileifぶんはパターンマッチングや条件じょうけんきOptionalアンラップをサポートします。
  • かく括弧かっこは、配列はいれつ宣言せんげん配列はいれつ要素ようそ取得しゅとく両方りょうほう使用しようされます。

Objective-Cとの類似るいじてん

  • 基本きほんてき数値すうちがたIntUIntFloatDoubleひとしのサポート。
  • クラスメソッドは、インスタンスメソッドと同様どうよう継承けいしょうされます。クラスメソッドないselfは、メソッドがされたクラスを意味いみします。
  • for...in列挙れっきょ構文こうぶんのサポート。

Objective-Cとの相違そういてん

  • ぶんはセミコロン(;)でわる必要ひつようはありません。しかし、1ぎょう複数ふくすうぶん記述きじゅつするさい使用しようすることができます。
  • ヘッダーファイルが存在そんざいしません。
  • /**/によるコメントはネストできます
  • かた推論すいろんのサポート。
  • ジェネリックプログラミングのサポート。
  • 関数かんすうだいいちきゅうオブジェクトです。
  • 演算えんざんはクラスにたいしてさい定義ていぎ演算えんざんのオーバーロード)でき、あたらしい演算えんざん定義ていぎできます。
  • 文字もじれつはUnicodeを完全かんぜんにサポートします。ほとんどのUnicode文字もじ識別子しきべつし演算えんざんでも使用しようできます。
  • 例外れいがい処理しょり存在そんざいしません。Swift 2では例外れいがい処理しょりとは互換ごかんせいのないべつのエラー処理しょりモデルが導入どうにゅうされています。
  • バグの原因げんいんとなるC言語げんごファミリーの特徴とくちょうがいくつか削除さくじょされています。
    • デフォルトでは、ポインタは公開こうかいされていません。プログラマが参照さんしょう管理かんりをする必要ひつようはありません。
    • 変数へんすうてはかえしません。これにより、===誤用ごようふせぐことができます。
    • switchぶんないbreakおこな必要ひつようはありません。明示めいじてきfallthroughおこなわないかぎつぎcaseにフォールスルーすることはありません。
    • 変数へんすう定数ていすうつね初期しょきされ、配列はいれつ境界きょうかいつねにチェックされます。
    • 算術さんじゅつオーバーフローは実行じっこうエラーとしてトラップされます。オーバーフローを許可きょかする演算えんざん&+&-&*&/&%として定義ていぎされます。また、すべての整数せいすうがたにはプロパティminmax定義ていぎされており、潜在せんざいてきなオーバーフローのチェックに利用りようすることができます。
    • ブロックをもちいない1ぎょうifぶんwhileぶんはサポートされていません。
    • Off-by-oneエラーの原因げんいんとなるC言語げんごスタイルのfor (int i = 0; i < c; i++)ぶんは、Swift 3で削除さくじょされました。
    • インクリメント演算えんざん++、デクリメント演算えんざん--は、Swift 3で削除さくじょされました。
SwiftにGCはありますか?
Swiftにはガベージコレクション(Garbage Collection, GC)はありません。わりに、Swiftは自動じどう参照さんしょうカウント(Automatic Reference Counting, ARC)とばれるメモリ管理かんり手法しゅほう採用さいようしています。ARCは、オブジェクトが参照さんしょうされているかぎりメモリを保持ほじし、参照さんしょうがなくなった時点じてん自動的じどうてきにメモリを解放かいほうする仕組しくみです。ARCは、Objective-Cでも採用さいようされており、SwiftはObjective-Cランタイムを利用りようすることができるため、Objective-Cで使用しようされるARCと互換ごかんせいがあります。

脚註きゃくちゅう

  1. ^ [1]
  2. ^ 2.0 2.1 2.2 2.3 Accepted proposals for Swift 3.0

外部がいぶリンク

附録ふろく

コードギャラリー

エラトステネスのふるい

エラトステネスのふるいを、若干じゃっかん Swift らしくいてみました。

エラトステネスのふるい
import Foundation

func sieveOfEratosthenes(_ n: Int) -> [Int] {
    var sieve = Array(repeating: true, count: n + 1)
    sieve[0] = false
    sieve[1] = false

    let sqrtN = Int(sqrt(Double(n)))
    for i in 2...sqrtN {
        if sieve[i] {
            for j in stride(from: i * i, through: n, by: i) {
                sieve[j] = false
            }
        }
    }

    return sieve.enumerated().compactMap { $1 ? $0 : nil }
}

print(sieveOfEratosthenes(100))
実行じっこう結果けっか
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

最大公約数さいだいこうやくすう最小公倍数さいしょうこうばいすう

最大公約数さいだいこうやくすう最小公倍数さいしょうこうばいすうを、若干じゃっかん Swift らしくいてみました。

最大公約数さいだいこうやくすう最小公倍数さいしょうこうばいすう
func gcd2(_ m: Int, _ n: Int) -> Int { n == 0 ? m : gcd2(n, m % n) }

func gcd(_ args: Int...) -> Int {
    guard let first = args.first else { return 0 }
    return args.suffix(args.count - 1).reduce(first){ gcd2($0, $1) }
}

func lcm2(_ m: Int, _ n: Int) -> Int { m * n / gcd2(m, n) }

func lcm(_ args: Int...) -> Int {
    guard let first = args.first else { return 0 }
    return args.suffix(args.count - 1).reduce(first){ lcm2($0, $1) }
}

print("gcd2(30, 45) => \(gcd2(30, 45))")
print("gcd(30, 72, 12) => \(gcd(30, 72, 12))")
print("lcm2(30, 72) => \(lcm2(30, 72))")
print("lcm(30, 42, 72) => \(lcm(30, 42, 72))")
実行じっこう結果けっか
gcd2(30, 45) => 15
gcd(30, 72, 12) => 6
lcm2(30, 72) => 360 
lcm(30, 42, 72) => 2520

二分にぶんほう

二分にぶんほうを、若干じゃっかん Swift らしくいてみました。

二分にぶんほう
func bisection(low: Double, high: Double, f: (Double) -> Double) -> Double {
    var low = low
    var high = high
    
    var x = (low + high) / 2.0
    var fx = f(x)
    
    if abs(fx) < 1.0e-10 {
        return x
    }
    
    if fx < 0.0 {
        low = x
    } else {
        high = x
    }
    
    return bisection(low: low, high: high, f: f)
}

let result1 = bisection(low: 0, high: 3) { x in return x - 1 }
print(result1)

let result2 = bisection(low: 0, high: 3) { x in return x * x - 1 }
print(result2)
実行じっこう結果けっか
0.9999999999417923
1.0000000000291038
きゅう課程かてい(-2012年度ねんど)高等こうとう学校がっこう数学すうがくB/数値すうち計算けいさんとコンピューター#2ふんほうれいを Swift に移植いしょくしました。