| 迅速 | |
|---|---|
Swift ロゴ | |
| パラダイム | マルチパラダイム:プロトコル指向、オブジェクト指向、関数型、命令型、ブロック構造、宣言型、並行型 |
| デザイン: | クリス・ラトナー、ダグ・グレガー、ジョン・マッコール、テッド・クレメネック、ジョー・グロフ、そしてアップル社[ 1 ] |
| 開発者 | Apple Inc.とオープンソース貢献者 |
| 初登場 | 2014年6月2日[ 2 ] |
| 安定版リリース | 6.2.1 [ 3 ] |
| プレビューリリース | 6.2 |
| タイピングの規律 | 静的、強い、推測 |
| メモリ管理 | 自動参照カウント |
| OS | Appleのオペレーティング システム ( Darwin、iOS、iPadOS、macOS、tvOS、visionOS、watchOS )、Linux、Windows、Android、z/OS |
| ライセンス | Apache License 2.0 (Swift 2.2以降) プロプライエタリ(Swift 2.2まで) [ 4 ] [ 5 ] |
| ファイル名拡張子 | .swift、.SWIFT |
| Webサイト | |
| 主要な実装 | |
| スイフト、シルバー | |
| 影響を受けた | |
| Objective-C、[ 6 ] Rust、Haskell、Ruby、Python、C#、CLU、[ 7 ] D [ 8 ] | |
| 影響を受けた | |
| Rust [ 9 ]、V(Vlang)[ 10 ]、Mojo [ 11 ]、Carbon [ 12 ] | |
Swiftは、2010年にクリス・ラトナーによってApple社向けに開発され、オープンソースコミュニティによって維持されている、高水準の 汎用、マルチパラダイム、コンパイル型 プログラミング言語です。Swiftは機械語にコンパイルされ、LLVMベースのコンパイラを使用します。Swiftは2014年6月に初めてリリースされ[ 13 ] 、Swiftツールチェーンは2014年9月にリリースされたXcodeバージョン6以降、 Xcodeに搭載されています。
Appleは、 Objective-Cに関連する多くのコアコンセプト、特に動的ディスパッチ、広範囲にわたる遅延バインディング、拡張可能なプログラミング、および同様の機能をSwiftでサポートすることを意図していましたが、より「安全な」方法でサポートすることで、ソフトウェアのバグをより簡単に検出できるようにしました。Swiftには、ヌルポインタの 参照解除などの一般的なプログラミングエラーに対処する機能があり、ピラミッドオブドゥームを回避するのに役立つ糖衣構文も提供されています。Swiftはプロトコル拡張性の概念をサポートしています。これは、型、構造体、クラスに適用できる拡張システムであり、Appleはこれをプログラミングパラダイムの真の変化として推進しており、「プロトコル指向プログラミング」[ 14 ] (特性や型クラスに類似)と呼んでいます。[ 15 ]
Swiftは、2014年のAppleの世界開発者会議(WWDC)で発表されました。[ 16 ] 2014年にはバージョン1.2へのアップグレードが行われ、2015年のWWDCではSwift 2へのメジャーアップグレードが行われました。当初はプロプライエタリ言語でしたが、バージョン2.2は2015年12月3日にApacheライセンス2.0に基づくオープンソースソフトウェアとなり、AppleのプラットフォームとLinuxで利用できるようになりました。[ 17 ] [ 18 ]
歴史
[編集]Swiftの開発は2010年7月にクリス・ラトナー氏によって開始され、最終的にはApple社の他の多くのプログラマーの協力を得て行われました。Swiftは、Apple社の以前のプログラミング言語であるObjective-Cの代替言語の必要性から生まれました。Objective-Cは1980年代初頭からほとんど変更されておらず、現代的な言語機能を欠いていました。Swiftは「Objective-C、Rust、Haskell、Ruby、Python、C#、CLUなど、数え切れないほど多くの言語から」言語のアイデアを取り入れました。[ 7 ] 2014年6月2日、Appleのワールドワイド開発者会議(WWDC)アプリケーションは、Swiftで書かれた最初の公開アプリとなりました。[ 19 ]会議では、登録済みのApple開発者向けにプログラミング言語のベータ版がリリースされましたが、同社はSwiftの最終版がテスト版とソースコード互換性があることを約束していませんでした。Apple社は、正式リリース時に必要であればソースコードコンバーターを提供する予定でした。[ 19 ]
Swiftプログラミング言語(500ページの無料マニュアル)もWWDCでリリースされ、Apple Books Storeと公式ウェブサイトで入手可能です。[ 20 ]
Swiftは2014年9月9日に1.0マイルストーンに到達し、iOS向けXcode 6.0のゴールドマスターを獲得しました。[ 21 ] Swift 1.1は2014年10月22日にXcode 6.1のリリースと同時にリリースされました。[ 22 ] Swift 1.2は2015年4月8日にXcode 6.3とともにリリースされました。[ 23 ] Swift 2.0はWWDC 2015で発表され、2015年9月21日にApp Storeでアプリを公開できるようになりました。[ 24 ]
Swift 3.0は2016年9月13日にリリースされました。[ 25 ]バージョン3.0を通じて、 Swiftの構文は大幅に進化し、コアチームは後のバージョンでソースの安定性に重点を置いてきました。[ 26 ] [ 27 ]
2017年9月19日にリリースされたSwift 4.0 [ 28 ]では、いくつかの組み込みクラスと構造体にいくつかの変更が導入されました。以前のバージョンのSwiftで書かれたコードは、Xcodeに組み込まれている移行機能を使用して更新できます。Swift 4.1は2018年3月29日にリリースされました[ 29 ]。 2018年第1四半期には、Swiftは測定された人気においてObjective-Cを上回りました[ 30 ]。
2019年3月にリリースされたSwift 5では、Appleプラットフォーム上で安定したバイナリインターフェースが導入され、SwiftランタイムをAppleのオペレーティングシステムに組み込むことが可能になりました。Swift 4とソースコード互換性があります。[ 31 ]
Swift 5.1は2019年9月に正式リリースされました。Swift 5.1は、モジュール安定性の導入により、言語の安定した機能をコンパイル時に拡張することで、以前のバージョンのSwift 5をベースにしています。モジュール安定性の導入によって、Swiftの将来のリリースで動作するバイナリフレームワークを作成して共有することが可能になりました。[ 32 ] 2021 WWDCでAppleが公式に発表したSwift 5.5では、並行性と非同期コードに対する言語サポートが大幅に拡張され、特にアクターモデルの独自バージョンが導入されました。[ 33 ] Swift 5.9は2023年9月にリリースされ、マクロシステム、ジェネリックパラメータパック、および newconsume演算子などの所有権機能が含まれています。[ 34 ] 2024年3月にリリースされたSwift 5.10では、言語の並行性モデルが改善され、データ競合を防ぐための完全なデータ分離が可能になりました。
Swift 6は2024年9月にリリースされました。[ 35 ] Swift 6.1は2025年3月にリリースされました。これには「生産性を向上させるための新しい言語機能強化、診断の改善、パッケージ特性、およびデータ競合の安全性と使いやすさとコンパイル時間を改善するための継続的な作業」が含まれています。[ 36 ]
Swiftは、2015年のStack Overflow開発者調査で最も愛されているプログラミング言語の1位を獲得しました[ 37 ]。 2016年には2位を獲得しました[ 38 ]。
2015年12月3日、Swift言語、サポートライブラリ、デバッガ、パッケージマネージャがApache 2.0ライセンス(ランタイムライブラリ例外付き)の下でオープンソース化され、[ 39 ]、プロジェクトをホストするためにSwift.orgが設立されました。ソースコードはGitHubでホストされており、誰でも簡単にコードを入手し、自分でビルドしたり、プルリクエストを作成してプロジェクトにコードを貢献したりすることができます。
2015年12月、IBMはSwift Sandboxウェブサイトを発表しました。これにより、開発者は1つのペインでSwiftコードを記述し、別のペインに出力を表示することができます。[ 40 ] [ 41 ] [ 42 ] Swift Sandboxは2018年1月に廃止されました。[ 43 ]
Appleは2016年のWWDCで、 Swiftでのコーディング方法を教えるiPad専用アプリ「Swift Playgrounds」を発表しました。このアプリは3Dビデオゲームのようなインターフェースで表示され、コード行を特定の順序で配置して実行するとフィードバックが表示されます。[ 44 ] [ 45 ] [ 46 ]
2017年1月、クリス・ラトナーはアップルを離れ、テスラモーターズに転職すると発表し、Swiftプロジェクトのリーダーの役割はチームのベテランであるテッド・クレメネックに引き継がれた。[ 47 ] [ 48 ]
2019年のWWDCで、AppleはXcode 11を搭載したSwiftUIを発表しました。これは、すべてのAppleプラットフォームで宣言的なUI構造設計のためのフレームワークを提供します。 [ 49 ]
LinuxのUbuntuディストリビューション用のSDKとツールチェーンの公式ダウンロードはSwift 2.2から利用可能で、Swift 5.2.4、CentOS、Amazon Linux以降はさらに多くのディストリビューションが追加されました。[ 50 ] Android用の非公式SDKとネイティブツールチェーンパッケージがあり、[ 51 ] [ 52 ] 2025年10月にSwiftのAndroidワークグループはAndroid用の公式Swift SDKのプレビューリリースを発表しました。[ 53 ]
プラットフォーム
[編集]Swiftがサポートするプラットフォームは、Appleのオペレーティングシステム(Darwin、iOS、iPadOS、macOS、tvOS、watchOS)、Linux、Windows、WebAssembly、Androidです。[ 54 ] [ 55 ]
Swiftの設計における重要な側面は、過去数十年にわたってApple製品向けに開発された膨大な量の既存のObjective-Cコード、例えばCocoaやCocoa Touch フレームワークと相互運用できることです。Appleプラットフォームでは[ 56 ] 、SwiftはObjective-Cランタイムライブラリとリンクしており、これによりC、Objective-C、C++、Swiftのコードを1つのプログラム内で実行できます。[ 57 ]
バージョン履歴
[編集]| Swift バージョン | 発売日 | macOS | リナックス | ウィンドウズ |
|---|---|---|---|---|
| 1.0 | 2014年9月9日 | はい | いいえ | いいえ |
| 1.1 | 2014年10月22日 | はい | いいえ | いいえ |
| 1.2 | 2015年4月8日 | はい | いいえ | いいえ |
| 2.0 | 2015年9月21日 | はい | いいえ | いいえ |
| 2.1 | 2015年10月20日 | はい | いいえ | いいえ |
| 2.2 | 2016年3月21日 | はい | はい | いいえ |
| 2.2.1 | 2016年5月3日 | はい | はい | いいえ |
| 3.0 | 2016年9月13日 | はい | はい | いいえ |
| 3.0.1 | 2016年10月28日 | はい | はい | いいえ |
| 3.0.2 | 2016年12月13日 | はい | はい | いいえ |
| 3.1 | 2017年3月27日 | はい | はい | いいえ |
| 3.1.1 | 2017年4月21日 | はい | はい | いいえ |
| 4.0 | 2017年9月19日 | はい | はい | いいえ |
| 4.0.2 | 2017年11月1日 | はい | はい | いいえ |
| 4.0.3 | 2017年12月5日 | はい | はい | いいえ |
| 4.1 | 2018年3月29日 | はい | はい | いいえ |
| 4.1.1 | 2018年5月4日 | いいえ | はい | いいえ |
| 4.1.2 | 2018年5月31日 | はい | はい | いいえ |
| 4.1.3 | 2018年7月27日 | いいえ | はい | いいえ |
| 4.2 | 2018年9月17日 | はい | はい | いいえ |
| 4.2.1 | 2018年10月30日 | はい | はい | いいえ |
| 4.2.2 | 2019年2月4日 | いいえ | はい | いいえ |
| 4.2.3 | 2019年2月28日 | いいえ | はい | いいえ |
| 4.2.4 | 2019年3月29日 | いいえ | はい | いいえ |
| 5.0 [ 58 ] | 2019年3月25日 | はい | はい | いいえ |
| 5.0.1 | 2019年4月18日 | はい | はい | いいえ |
| 5.0.2 | 2019年7月15日 | いいえ | はい | いいえ |
| 5.0.3 | 2019年8月30日 | いいえ | はい | いいえ |
| 5.1 | 2019年9月10日 | はい | はい | いいえ |
| 5.1.1 | 2019年10月11日 | いいえ | はい | いいえ |
| 5.1.2 | 2019年11月7日 | はい | はい | いいえ |
| 5.1.3 | 2019年12月13日 | はい | はい | いいえ |
| 5.1.4 | 2020年1月31日 | いいえ | はい | いいえ |
| 5.1.5 | 2020年3月9日 | いいえ | はい | いいえ |
| 5.2 | 2020年3月24日 | はい | はい | いいえ |
| 5.2.1 | 2020年3月30日 | いいえ | はい | いいえ |
| 5.2.2 | 2020年4月15日 | はい | はい | いいえ |
| 5.2.3 | 2020年4月29日 | いいえ | はい | いいえ |
| 5.2.4 | 2020年5月20日 | はい | はい | いいえ |
| 5.2.5 | 2020年8月5日 | いいえ | はい | いいえ |
| 5.3 | 2020年9月16日 | はい | はい | はい[ 59 ] |
| 5.3.1 | 2020年11月13日 | はい | はい | はい |
| 5.3.2 | 2020年12月15日 | はい | はい | はい |
| 5.3.3 | 2021年1月25日 | いいえ | はい | はい |
| 5.4 [ 60 ] | 2021年4月26日 | はい | はい | はい |
| 5.4.1 | 2021年5月25日 | いいえ | はい | はい |
| 5.4.2 | 2021年6月28日 | はい | はい | はい |
| 5.4.3 | 2021年9月9日 | いいえ | はい | はい |
| 5.5 | 2021年9月20日 | はい | はい | はい |
| 5.5.1 | 2021年10月27日 | はい | はい | はい |
| 5.5.2 | 2021年12月14日 | はい | はい | はい |
| 5.5.3 | 2022年2月9日 | いいえ | はい | はい |
| 5.6 [ 61 ] | 2022年3月14日 | はい | はい | はい |
| 5.6.1 [ 62 ] | 2022年4月9日 | いいえ | はい | はい |
| 5.6.2 [ 63 ] | 2022年6月15日 | いいえ | はい | はい |
| 5.6.3 [ 64 ] | 2022年9月2日 | いいえ | はい | はい |
| 5.7 [ 65 ] | 2022年9月12日 | はい | はい | はい |
| 5.7.1 [ 66 ] | 2022年11月1日 | はい | はい | はい |
| 5.8 [ 67 ] | 2023年3月30日 | はい | はい | はい |
| 5.8.1 [ 68 ] | 2023年6月1日 | はい | はい | はい |
| 5.9 [ 69 ] | 2023年9月18日 | はい | はい | はい |
| 5.9.1 [ 70 ] | 2023年10月19日 | はい | はい | はい |
| 5.9.2 [ 71 ] | 2023年12月11日 | はい | はい | はい |
| 5.10 [ 72 ] | 2024年3月5日 | はい | はい | はい |
| 5.10.1 [ 73 ] | 2024年6月5日 | はい | はい | はい |
| 6.0 [ 74 ] | 2024年9月16日 | はい | はい | はい |
| 6.1 [ 75 ] | 2025年3月31日 | はい | はい | はい |
| 6.2 [ 76 ] | 2025年9月17日 | はい | はい | はい |
特徴
[編集]Swiftは、現代的なプログラミング言語理論の概念を採用し、シンプルでありながら強力な構文を提供することを目指した汎用プログラミング言語です。Swiftは、Appleプラットフォームの主要な開発言語としてSwiftに取って代わったObjective-Cから大きな影響を受けており、様々なプログラミング言語の革新性と慣習を取り入れています。
Swiftは、速度を犠牲にすることなく、新しいプログラマにとって安全で使いやすいように設計されています。デフォルトでは、Swiftはすべてのメモリを自動的に管理し、変数が使用前に常に初期化されることを保証します。配列アクセスは範囲外エラーがチェックされ、整数演算はオーバーフローがチェックされます。パラメータ名により、明確なAPIを作成できます。プロトコルは型が採用できるインタフェースを定義し、拡張機能により開発者は既存の型に機能を追加できます。Swiftは、クラス、サブタイプ、メソッドのオーバーライドをサポートすることで、オブジェクト指向プログラミングを可能にします。オプショナルにより、 nil値を明示的に安全に処理できます。並行プログラムはasync/await構文を使用して記述でき、アクターはデータ競合を排除するために共有された可変状態を分離します。[ 77 ] [ 78 ]
基本的な構文
[編集]Swiftの構文はC言語に似ています。コードはデフォルトでグローバルスコープで実行を開始します。[ 79 ]また、この属性を構造体、クラス、または列挙型の宣言に適用して、プログラムのエントリポイントが含まれていることを示すこともできます。[ 80 ]@main
Swift の「Hello, World!」プログラムは次のとおりです。
印刷( "Hello, world!" )ここで使用する関数はSwiftの標準ライブラリに含まれており、外部モジュールをインポートすることなくすべてのプログラムで利用できます。Swiftの文はセミコロンで終わる必要はありませんが、同じ行に複数の文を記述する場合はセミコロンが必要です。1行コメントはで始まり、現在の行の終わりまで続きます。複数行コメントはと文字で囲まれます。定数は キーワードで宣言され、変数はキーワードで宣言されます。値は読み込まれる前に初期化する必要があります。値は、提供された初期値の型に基づいて型を推測できます。初期値が値の宣言後に設定された場合、型を明示的に宣言する必要があります。[ 79 ]print(_:separator:terminator:)///**/letvar
let highScoreThreshold = 1000 // Int 型の定数。型は指定された値に基づいて推論されます。 var currentScore = 980 // Int 型の変数。 currentScore = 1200 // 変数の値は時間の経過とともに変化する可能性があります。 let playerMessage : String // 明示的な型 String の定数。 現在のスコア>高スコアしきい値{ playerMessage = "あなたはトッププレイヤーです!" }それ以外{ playerMessage = "次回はもっと頑張ってください。" }print ( playerMessage ) // 「あなたはトッププレイヤーです!」と出力します。 Swift における制御フローは、if-else、guard、switch文、そしてwhile ループとfor-in ループによって管理されます。これらのif文はブール値のパラメータを取り、条件が真であれば文の本体を実行しif、偽であればオプションのelse本体を実行します。syntaxは、オプション値の存在を確認し、同時にそれを展開するための糖衣構文を提供します。if-let
someNumber = 42とします if someNumber % 2 == 0 { // 剰余演算子を使用して、someNumber を 2 で割った余りを計算します。 print ( " \( someNumber )は偶数です。" )}それ以外{ print ( " \( someNumber )は奇数です。" )}// 「42 は偶数です。」と出力します。関数はキーワードで定義されます。関数のパラメータには名前を付けることができ、関数呼び出しをフレーズのように読みやすくすることができます。パラメータ名の前にアンダースコアを付けると、呼び出し元で引数ラベルを省略できます。タプルは、関数で複数のデータを一度に返すために使用できます。func
func constructGreeting ( for name : String ) -> String { "Hello \( name ) !"を返します }let greeting = constructGreeting ( for : "Craig" ) print ( greeting ) // "Hello Craig!" を出力します。 関数、およびクロージャと呼ばれる匿名関数は、プロパティに割り当てて、他の値と同様にプログラム内で渡すことができます。
関数divideByTwo ( _aNum : Int ) - > Int { aNum / 2を返す }func multiplyByTwo ( _ aNum : Int ) -> Int { aNum * 2を返す }数学演算= 2乗乗 print ( mathOperation ( 21 )) // "42" と出力します 文は、指定された条件が真である場合にのみ実行されguard、偽である場合は指定された節の本体がguard実行されます。else節は、文が出現するコードブロックの制御を終了しなければなりませんelse。guard文は、プログラムの実行を続行する前に特定の要件が満たされていることを確認するのに役立ちます。特に、オプション値のラップされていないバージョンを作成するために使用できます。この値は、囲むスコープの残りの部分ではnil以外であることが保証されます。guard
func divide (分子: Int ?, byDenominator分母: Int ) -> Int ? { ガード分母!= 0 else { print ( "0で割ることはできません。" ) nilを返す } ガードlet分子else { print ( "指定された分子はnilです。" ) nilを返す } 分子/分母を返す }結果= divide (分子: 3 、分母: 0 )とします。 print ( "除算の結果は: \( result ) " )// 出力:// "0 で割ることはできません。"// "除算の結果は nil です。"switch文は、値を複数の値と比較し、関連するコードブロックを実行します。switch文は網羅的に記述する必要があります。つまり、すべての可能な値に対応するケースを含めるか、default指定された値が他のどのケースにも一致しない場合に実行されるケースを含める必要があります。switchケースは暗黙的にフォールスルーしませんが、fallthroughキーワードを使用して明示的にフォールスルーすることは可能です。パターンマッチングは文内でさまざまな方法で使用できますswitch。以下は、整数を複数の範囲と照合する例です。
someNumber = 42とします スイッチsomeNumber { ケース..< 0 : print ( " \( someNumber )は負です。" )ケース0 : print ( " \( someNumber )は 0 です。" )ケース1. .. 9 : print ( " \( someNumber )は 0 より大きいが 10 より小さい。" )デフォルト: print ( " \( someNumber )は 9 より大きいです。" )}// 「42 は 9 より大きいです。」と出力します。for-inループは値のシーケンスを反復します。
names = [ "ウィル" , "アンナ" , "バート" ]とします。 名前内の名前{ 印刷(名前)}// 出力:// 意思// アンナ// バートwhileループは、指定されたブール条件が次のように評価される限り繰り返されますtrue。
// 1 から 5 までのすべての数字を合計します。変数i = 1 変数結果= 0 while i <= 5 { // i が 5 以下の間、ループは本体を実行します。 result += i // 現在の結果に i を加算します。 i += 1 // i を 1 増加します。 }print ( result ) // "15" と出力します 閉鎖サポート
[編集]Swiftはクロージャをサポートしています。クロージャとは、コード内で渡したり使用したりできる自己完結的な機能ブロックであり、[ 81 ]匿名関数としても使用できます。以下にいくつか例を示します。
// 入力値と出力値によって定義されるクロージャ型は、クロージャの外部で指定できます。クロージャ1 : ( Int , Int ) - > Int = { arg1 , arg2in 引数1 +引数2を返す }// …またはその内部:closure2 = { ( arg1 : Int , arg2 : Int ) -> Int inとします 引数1 +引数2を返す }// ほとんどの場合、クロージャの戻り値の型はコンパイラによって自動的に推論されます。クロージャ3 = { arg1 : Int , arg2 : Int in 引数1 +引数2を返す }クロージャは変数や定数に代入でき、他の関数やクロージャにパラメータとして渡すこともできます。単一式のクロージャでは、returnキーワードを省略できます。
Swiftには後置クロージャ構文もあり、関数の引数リスト内ではなく、関数呼び出しの末尾にクロージャを記述できます。クロージャが関数の唯一の引数である場合は、括弧を完全に省略できます。
// この関数は入力パラメータを受け取らず整数を返すクロージャを受け取ります。// それを評価し、クロージャの戻り値 (Int) を関数の戻り値として使用します。func foo (クロージャbar : () -> Int ) -> Int { リターンバー() }// 末尾のクロージャ構文なし:foo (クロージャ: { return 1 }) // 末尾にクロージャ構文があり、暗黙的な戻り値がある場合:フー{ 1 } バージョン5.3以降、Swiftは複数の末尾クロージャをサポートしています。[ 82 ]
// この関数は、最初のクロージャの戻り値を 2 番目のクロージャのパラメータとして渡し、2 番目のクロージャの結果を返します: func foo ( bar : () -> Int , baz : ( Int ) - > Int ) -> Int { return baz ( bar ()) } // 末尾にクロージャがない場合: foo ( bar : { return 1 }, baz : { x in return x + 1 }) // 末尾に1つのクロージャがある場合: foo ( bar : { return 1 }) { x in return x + 1 } // 2つの末尾クロージャがある場合(最初のクロージャの引数名のみ省略):foo { return 1 } baz : { x in return x + 1 } Swiftはインラインクロージャに省略形の引数名を提供するため、クロージャパラメータの全てに明示的に名前を付ける必要がなくなります。[ 83 ]引数は$0、$1、$2などの名前で参照できます。
let names = [ "ジョセフィン" , "スティーブ" , "クリス" , "バーバラ" ] // filter は names の各値に対して指定されたクロージャを呼び出します。//文字数が6 未満の値は保持され、それ以外は削除されます。let shortNames = names . filter { $0 . count < 6 } print ( shortNames ) // "["Steve", "Chris"]" を出力します クロージャは、その周囲のスコープから値をキャプチャすることができます。クロージャは、クロージャが存在する限り、キャプチャされた値を参照します。
func makeMultiplier ( withMultiple multiple : Int ) -> ( Int ) -> ( Int ) { // Int を受け取り、入力に multiple の値を掛けた値を返すクロージャを作成して返します。return { $0 * multiple } } let multiplier = makeMultiplier ( withMultiple : 3 ) print ( multiplier ( 3 )) // "9" と表示されますprint ( multiplier ( 10 )) // "30" と表示されます 文字列のサポート
[編集]Swift標準ライブラリには、Unicode準拠の型StringとCharacter型が含まれています。文字列値は、二重引用符で囲まれた文字列リテラルで初期化できます。文字列は、+演算子を使って連結できます。
var someString = "こんにちは、" someString += "世界!" 文字列補間は、他の値や式から新しい文字列を作成することを可能にします。括弧で囲まれた値は、\その括弧内の文字列リテラルに挿入されます。[ 84 ]
var currentScore = 980 print ( "あなたのスコアは\( currentScore )です。" ) // 「あなたのスコアは 980 です。」と出力します。for-in ループを使用すると、文字列に含まれる文字を反復処理できます。
「Swift」の文字の場合{ print ( character ) } // S // w // i // f // t Foundation フレームワークがインポートされると、Swift は String 型を NSString (Objective-C で一般的に使用される String クラス) に目に見えない形でブリッジします。
呼び出し可能なオブジェクト
[編集]Swiftでは、呼び出し可能なオブジェクトはを使用して定義されますcallAsFunction。[ 85 ]
struct CallableStruct { var value : Int func callAsFunction ( _ number : Int , scale : Int ) { print ( scale * ( number + value )) } } let callable = CallableStruct ( value : 100 ) callable ( 4 , scale : 2 ) callable . callAsFunction ( 4 , scale : 2 ) // どちらの関数呼び出しも 208 を出力します。 アクセス制御
[編集]Swiftは、シンボルに対して5つのアクセス制御openレベル( 、public、internal、fileprivate)をサポートしていますprivate。多くのオブジェクト指向言語とは異なり、これらのアクセス制御は継承階層を無視します。は、シンボルが直近のスコープprivate内でのみアクセス可能であることを示し、は、ファイル内からのみアクセス可能であることを示し、 は、シンボルを含むモジュール内からアクセス可能であることを示し、 は、どのモジュールからもアクセス可能であることを示し、(クラスとそのメソッドのみ)クラスがモジュール外でサブクラス化できることを示します。[ 86 ]fileprivateinternalpublicopen
オプションと連鎖
[編集]Swift の重要な機能の一つにオプション型があります。これは、 C言語の一般的なパターンと同様に、参照や値の操作を可能にします。C 言語では、ポインタは特定の値を参照するか、全く値を参照しないかのいずれかになります。つまり、オプション型ではない型ではnull ポインタエラーが発生しないということです。コンパイラは null ポインタエラーが発生しないように保証できます。
Optional 型はOptionalenum で作成されます。null 許容の Integer を作成するには、 のような宣言を使用しますvar optionalInteger: Optional<Int>。C# と同様に、[ 87 ] Swift にもこれに対する糖衣構文が含まれており、型名の後に疑問符 を置くことで、変数がオプションであることを示すことができますvar optionalInteger: Int?。[ 88 ]オプションとしてマークされた変数または定数は、基になる型の値を持つか ですnil。Optional 型は基本型をラップするため、異なるインスタンスが生成されます。Stringと はString?根本的に異なる型で、前者は 型であるのStringに対し、後者はOptional何らかのString値を保持している可能性のある です。
内部の値にアクセスするには(nilではないと仮定した場合)、内部のインスタンスを公開するためにアンラップする!必要があります。これは次の演算子で実行されます。
myValue = anOptionalInstance ! .someMethod ()とします。 この場合、!演算子は内部のインスタンスをアンラップして公開しanOptionalInstance、メソッド呼び出しを可能にします。インスタンスがnilの場合、nullポインタエラーが発生し、プログラムは終了します。これは強制アンラップと呼ばれます。オプショナルは、オプショナルチェイニングanOptionalInstanceを使用することで安全にアンラップできます。オプショナルチェイニングでは、まずインスタンスがnilかどうかをテストし、nullでない場合はアンラップします。
myValue = anOptionalInstance ? .someMethod ()とします。 この場合、ランタイムはがnilでないsomeMethod場合にのみを呼び出しanOptionalInstance、エラーを抑制します。すべてのオプションプロパティの後に を置く必要があります。これらのプロパティのいずれかがnilの場合、式全体がnilとして評価されます。 「チェーニング」?という用語の由来は、複数のメソッド呼び出し/ゲッターが連鎖的に接続され、より一般的なケースに由来しています。例えば、次のようになります。
aTenant = aBuilding.tenantList [ 5 ] 、theirLease = aTenant.leaseDetails 、leaseStart = theirLease ? .startDateとします。 次のように簡略化できます。
let leaseStart = aBuilding.tenantList [ 5 ] .leaseDetails ? .startDate Swift のオプションの使用により、アンラップアクションがランタイム ディスパッチ システムで発生するのではなく、定義済みのインスタンス (ラッパー) で呼び出されるため、 コンパイラは静的ディスパッチを使用できます。
値の型
[編集]多くのオブジェクト指向言語では、オブジェクトは内部的に2つの部分で表現されます。オブジェクトはヒープ上に置かれたデータブロックとして保存され、そのオブジェクトの名前(または「ハンドル」)はポインタによって表現されます。オブジェクトはポインタの値をコピーすることでメソッド間で受け渡されるため、コピーを持つ人は誰でもヒープ上の同じ基礎データにアクセスできます。一方、整数や浮動小数点値などの基本型は直接表現されます。ハンドルにはデータが格納されますが、データへのポインタは含まれません。そして、そのデータはコピーによって直接メソッドに渡されます。これらのアクセススタイルは、オブジェクトの場合は参照渡し、基本型の場合は値渡しと呼ばれます。
どちらの概念にも長所と短所があります。オブジェクトは、ウィンドウの記述やドキュメントの内容など、データが大きい場合に便利です。このような場合、データへのアクセスは、データ構造全体をコピーするのではなく、32ビットまたは64ビットの値をコピーすることで実現されます。しかし、整数などの小さな値はポインタと同じサイズ(通常はどちらも1ワード)であるため、値を渡す場合と比べてポインタを渡すことには利点がありません。
Swiftは、参照渡しまたは値渡しのセマンティクスを使用するオブジェクトを組み込みでサポートしています。前者はclass宣言を使用し、後者はを使用します。Swiftの構造体は、メソッド、プロトコルの実装、拡張メカニズムの使用など、クラスとほぼすべての機能を備えています。このため、Appleはすべてのデータをオブジェクトstructや値ではなく、インスタンスと総称しています。ただし、構造体は継承をサポートしていません。[ 89 ]
プログラマは、アプリケーション内の各データ構造に対して、どのセマンティクスがより適切であるかを自由に選択できます。ウィンドウのような大きな構造はクラスとして定義され、ポインタとして渡すことができます。2Dポイントのような小さな構造は構造体として定義でき、値渡しとなり、間接参照や参照カウントなしで内部データに直接アクセスできます。値渡しの概念に固有のパフォーマンス向上により、Swiftは、IntやDouble、通常はオブジェクトによって表される や などの型を含む、ほぼすべての一般的なデータ型にこれらの型を使用しています。[89] 値型を使用すると、StringユーザーArrayアプリケーションでも大幅なパフォーマンス向上が期待できます。[ 90 ]
Array、、DictionaryそしてSetそれらはすべてコピーオンライトを利用しており、プログラムがそれらの値を変更しようとした場合にのみデータがコピーされます。これは、様々なアクセサが実質的に同じデータストレージへのポインタを持つことを意味します。したがって、データは物理的にはメモリ上に1つのインスタンスとして保存されますが、アプリケーションレベルではこれらの値は別々であり、必要な場合にのみコピーオンライトによって物理的な分離が強制されます。[ 91 ]
拡張機能
[編集]拡張機能は、既存の型に新しい機能を追加します。サブクラス化したり、元のソースコードにアクセスしたりする必要はありません。拡張機能は、新しいメソッド、初期化子、算出プロパティ、添え字、プロトコル適合性などを追加できます。[ 92 ]例えば、基本String型にスペルチェッカーを追加すると、プログラム内のすべてのインスタンスが Stringスペルチェック機能を持つようになります。このシステムはまた、関連するコードをライブラリのような拡張機能にまとめることができる組織化技術としても広く使用されています。
拡張機能はキーワードで宣言されますextension。
構造体長方形{ 幅: Double 高さ: Double }拡張子長方形{ 変数エリア: Double { 高さ*幅を返す }}プロトコル指向プログラミング
[編集]プロトコルは、特定の型が一連のメソッドまたはプロパティを実装することを約束します。つまり、システム内の他のインスタンスは、そのプロトコルを実装する任意のインスタンス上のそれらのメソッドを呼び出すことができます。これは、現代のオブジェクト指向言語において多重継承の代替としてよく使用されますが、機能セットは完全に同じではありません。
Objective-Cやプロトコルの概念を実装する他のほとんどの言語では、各クラスに必要なメソッドが実装されていることを確認するのはプログラマーの責任です。[ 93 ] Swiftでは、拡張機能を用いてこれらのメソッドを追加し、ジェネリックプログラミング(ジェネリック)を用いて実装する機能が追加されました。これらを組み合わせることで、プロトコルを一度記述するだけで、多様なインスタンスをサポートできます。また、拡張メカニズムを使用することで、定義にプロトコルが記載されていないオブジェクトにプロトコル準拠性を追加することもできます。[ 94 ]
たとえば、プロトコルは と呼ばれPrintable、これにより、プロトコルに準拠するインスタンスがdescriptionプロパティとprintDetails()メソッドの要件を実装することが保証されます。
// Printable という名前のプロトコルを定義します。protocol Printable { var description : String { get } // 読み取り専用プロパティの要件func printDetails () // メソッドの要件} このプロトコルは、他のタイプでも採用できるようになりました。
// クラスで Printable プロトコルを採用する class MyClass : Printable { var description : String { return " An instance of MyClass" } func printDetails () { print (説明) } } 拡張機能は、型にプロトコルの適合性を追加するために使用できます。プロトコル自体も、要件を満たすデフォルトの実装を提供するために拡張できます。採用者は独自の実装を定義することも、デフォルトの実装を使用することもできます。
extension Printable { // すべての Printable インスタンスはこの実装を受け取ります。または、独自に定義することもできます。func printDetails () { print ( description ) } } // Bool は Printable に準拠し、上記の printDetails() 実装を継承します。extension Bool : Printable { var description : String { return "An instance of Bool with value: \( self ) " } }Swift では、インターフェースをサポートする多くの最新言語と同様に、プロトコルを型として使用できるため、変数とメソッドは特定の型ではなくプロトコルによって定義できます。
func getSomethingPrintable () ->任意の印刷可能オブジェクト{ trueを返す} var someSortOfPrintableInstance = getSomethingPrintable () print ( someSortOfPrintableInstance .説明) // 「値が true の Bool インスタンス」を出力しますの具体的な型が何であるかは関係ありませんsomeSortOfPrintableInstance。コンパイラはそれがプロトコルに準拠していることを保証するため、このコードは安全です。この構文は、 のように、コレクションもプロトコルに基づいて記述できることも意味しますlet printableArray = [any Printable]。
Swiftの標準ライブラリでは、拡張機能とプロトコルの両方が広く使用されています。Swift 5.9では、標準ライブラリ内のすべてのシンボルの約1.2%がプロトコルであり、さらに12.3%がプロトコル要件またはデフォルト実装でした。[ 95 ]例えば、Swiftは拡張機能を使用して、Equatable文字列や配列などの多くの基本型にプロトコルを追加し、演算子で比較できるようにしています==。Equatableプロトコルは、このデフォルト実装も定義しています。
関数!=< T : Equatable >( lhs : T , rhs : T ) ->ブール値 Equatableこの関数は、 に準拠する任意のインスタンスに対して機能し、非等価演算子を提供するメソッドを定義します。クラスまたは構造体のインスタンスは、 に準拠するだけで自動的にこの実装を取得しますEquatable。[ 96 ]
プロトコル、拡張機能、ジェネリックを組み合わせることで、高度なAPIを作成できます。例えば、制約を利用することで、型の特性に基づいて、プロトコルやメソッドを条件付きで採用することが可能になります。一般的なユースケースとしては、コレクションに含まれる要素が以下の条件を満たす場合にのみ、コレクション型にメソッドを追加するといったものが挙げられますEquatable。
要素が等価である拡張配列{ // allEqual は、Equatable 要素を含む配列のインスタンスに対してのみ使用できます。func allEqual () -> Bool { for element in self { if element != self . first { return false } } return true } } 同時実行性
[編集]Swift 5.5では構造化並行性が言語に導入されました。[ 97 ]構造化並行性はKotlin、JavaScript、Rustと同様のAsync/awaitasync構文を使用します。非同期関数は、パラメータリストの後にキーワードを付けて定義されます。非同期関数を呼び出す際は、await関数の呼び出し中に実行が中断される可能性があることを示すために、関数の前にキーワードを記述する必要があります。関数が中断されている間、プログラムは同じプログラム内の他の並行関数を実行する可能性があります。この構文により、プログラムは潜在的な中断ポイントを明確に呼び出すことができ、これまで広く使用されていたクロージャコールバックによって引き起こされたピラミッドオブドゥームのような状態を回避できます。[ 98 ]
func downloadText ( name : String ) async -> String { let result = // ... 非同期ダウンロードコード ... return result } text = await downloadText ( "text1" )を実行します。 このasync let構文を使用すると、複数の関数を並行して実行できます。は、awaitプログラムが一時停止して、以前に呼び出された関数の完了を待機するポイントをマークするために再び使用されますasync。
// これらのdownloadTextの呼び出しはそれぞれ並列に実行されます。async let text1 = downloadText ( name : "text1" ) async let text2 = downloadText ( name : "text2" ) async let text3 = downloadText ( name : "text3 " ) let textToPrint = await [ text1 , text2 , text3 ] // 3つのdownloadText呼び出しがすべて返されるまで中断します。print ( textToPrint ) タスクとタスク グループを明示的に作成して、実行時に動的な数の子タスクを作成できます。
taskHandle = Task { downloadText ( name : "someText" )を待機します} 結果=タスクハンドルを待機します。値 Swift はActor モデルを使用して可変状態を分離し、異なるタスクが共有状態を安全に変更できるようにします。Actor はactorキーワードで宣言され、クラスと同様に参照型です。Actor の可変状態に同時にアクセスできるのは 1 つのタスクのみです。Actor は自身の内部状態に自由にアクセスし、変更することができますが、別のタスクで実行されるコードは、各アクセスにawaitキーワードを付けて、他のタスクが Actor の状態へのアクセスを完了するまでコードが一時停止する可能性があることを示す必要があります。
アクターディレクトリ{ var names : [ String ] = [] func add ( name : String ) { names . append ( name ) } } ディレクトリ=ディレクトリ( ) // 他のタスクがアクターへのアクセスを完了するまでコードは中断されます。await directory.add ( name : " Tucker " ) print ( await directory.names ) ライブラリ、ランタイム、開発
[編集]Appleシステムでは、Swiftは既存のObjective-Cシステムと同じランタイムを使用しますが、iOS 7またはmacOS 10.9以上が必要です。また、Grand Central Dispatchにも依存します。[ 99 ] SwiftとObjective-Cのコードは1つのプログラムで使用でき、拡張によりCとC++も使用できます。Swift 5.9以降では、C++コードをSwiftコードから直接使用できます。[ 100 ] Objective-Cの場合、Swiftはオブジェクトモデルにかなりアクセスでき、Objective-Cコードをサブクラス化、拡張し、使用してプロトコルサポートを提供できます。[ 101 ]逆は当てはまりません。SwiftクラスをObjective-Cでサブクラス化することはできません。[ 102 ]
このようなプログラムの開発と既存コードの再利用を支援するため、Xcode 6以降では、Objective-CコードをSwiftに公開するためのブリッジングヘッダーを構築・維持する半自動システムを提供しています。これは、プロジェクトのSwiftコードに必要なすべてのObjective-Cシンボルを定義またはインポートする追加のヘッダーファイルの形をとります。これにより、Swiftは、これらのインポートで宣言された型、関数、変数を、Swiftで記述されたかのように参照できます。また、Objective-Cコードは、プロジェクトのSwiftシンボルのObjective-C宣言を含む自動管理ヘッダーファイルをインポートすることで、Swiftコードを直接使用することもできます。例えば、「MyApp」という混合プロジェクト内のObjective-Cファイルは、コードを使用してSwiftのクラスまたは関数にアクセスできます#import "MyApp-Swift.h"。ただし、このメカニズムではすべてのシンボルが利用できるわけではありません。ジェネリック型、非オブジェクトのオプション型、高度な列挙型、さらにはUnicode識別子などのSwift固有の機能を使用すると、シンボルがObjective-Cからアクセスできなくなる場合があります。[ 103 ]
Swift は、開発環境によって読み込まれるメタデータである属性のサポートも限定的ですが、これは必ずしもコンパイル済みコードの一部ではありません。Objective-C と同様に、属性は@構文を使用しますが、現在利用可能なセットは限られています。一例として@IBOutlet、 属性はコード内の特定の値をアウトレットとしてマークし、 Interface Builder (IB)内で使用できます。アウトレットとは、画面上のディスプレイの値をコード内のオブジェクトにバインドするデバイスです。
Apple以外のシステムでは、SwiftはObjective-Cランタイムやその他のAppleシステムライブラリに依存しません。Swiftの「Corelib」実装セットがそれらを置き換えます。これには、Foundation Kitの代替となる「swift-corelibs-foundation」、Grand Central Dispatchの代替となる「swift-corelibs-libdispatch」、 XcodeのXCTest APIの代替となる「swift-corelibs-xctest」が含まれます。[ 104 ]
2019年現在、AppleはXcode 11でSwiftUIと呼ばれる新しい主要なUIパラダイムを追加しました。SwiftUIは、従来のInterface Builderパラダイムを新しい宣言型開発パラダイムに置き換えます。[ 105 ]
メモリ管理
[編集]Swiftはメモリ管理に自動参照カウント(ARC)を使用します。クラスまたはクロージャのすべてのインスタンスは参照カウントを保持し、プログラムが保持している参照の数を常に記録します。このカウントが0になると、インスタンスは解放されます。この自動解放により、不要になったインスタンスはすぐに解放されるため、ガベージコレクターは不要になります。
強い循環参照は、2つのインスタンスが互いに強く参照し合う場合(例:AがBを参照し、BがAを参照する場合)に発生する可能性があります。どちらのインスタンスの参照カウントも0になることはなく、どちらも解放されることもないため、メモリリークweakが発生します。Swiftは強い循環参照を防ぐために、キーワードとを提供していますunowned。これらのキーワードにより、インスタンスの参照カウントを増やすことなく参照できます。weak参照は、変更されてになる可能性があるため、オプションの変数でなければなりませんnil。[ 106 ]すでに解放された値にアクセスしようとすると、unowned実行時エラーが発生します。
クラス内のクロージャは、自己参照をキャプチャすることで強い参照循環を引き起こす可能性があります。弱参照または非所有参照として扱うべき自己参照は、キャプチャリストを使用して指定できます。
クラスPerson { let name :文字列 weak var home : Home ? // 参照サイクルを断ち切るために弱参照として定義されます。弱参照では、参照先のインスタンスの参照カウントは増加しません。 init (名前:文字列) { 自己.名前=名前 } deinit { print ( "初期化解除された\( name ) " ) } }クラスホーム{ let address :文字列 var owner :人? init (アドレス:文字列、所有者:人?) { 自己.アドレス=アドレス 自己.所有者=所有者 } deinit { print ( "初期化解除された\(アドレス) " ) } }var stacy : Person ? = Person ( name : "Stacy" ) var house21b : Home ? = Home (住所: "21b Baker Street" 、所有者: stacy ) stacy ?. home = house21b // stacy と house42b がお互いを参照するようになりました。 stacy = nil // house21b がまだ stacy への参照を保持しているため、stacy の参照カウントは現在 1 です。 house21b = nil // house21b の参照カウントは 0 に下がり、その結果、stacy のカウントも 0 に下がります。これは、house21b が stacy への強い参照を保持している最後のインスタンスであるためです。 // 出力:// 初期化解除された 21b ベイカー ストリート// 初期化解除されたステイシーデバッグ
[編集]Swiftシステムの重要な要素は、開発環境内で読み取り・評価・印刷ループ(REPL)を使用してきれいにデバッグおよび実行できることです。これにより、従来のシステムプログラミング言語よりもPythonのスクリプト機能に近いインタラクティブな特性が得られます。REPLは、プレイグラウンド、つまりXcode環境またはプレイグラウンドアプリ内で実行されるインタラクティブなビューによってさらに強化され、コードやデバッガの変更に即座に反応します。[ 107 ]プレイグラウンドを使用すると、プログラマーはSwiftコードとマークダウンドキュメントを追加できます。プログラマーは、コンソールまたはXcodeなどのIDEでLLDBを使用してコードをステップ実行し、ブレークポイントを追加できます。
他の言語との比較
[編集]Swift はC ファミリーのプログラミング言語と考えられており、さまざまな点で C と似ています。
- C言語の演算子のほとんどはSwiftにも存在しますが、 などの一部の演算子は
+若干異なる動作をします。例えば、Swiftでは は+オーバーフローをトラップしますが、 は&+オーバーフロー時にラップするというC言語のような動作を示すために使用されます。 - 中括弧はステートメントをグループ化するために使用されます。
- 変数は等号を用いて代入されますが、比較には連続する2つの等号
===を用いて行われます。2つのデータ要素が同じオブジェクトを参照しているかどうかを確認するために、新しい恒等演算子が提供されています。 - 制御ステートメント
while、if、 はswitch類似していますが、拡張機能があります。たとえば、switchは非整数ケースを受け取り、whileパターンマッチングと条件付きアンラップ オプションifをサポートし、 構文を使用します。forfor i in 1...10 - 角括弧は配列とともに使用され、配列を宣言するだけでなく、配列内の特定のインデックスにある値を取得するためにも使用されます。
Objective-C との類似点もあります。
- 基本的な数値型:
Int, UInt, Float, Double - クラス メソッドはインスタンス メソッドと同様に継承されます。
selfクラス メソッドでは、メソッドが呼び出されたクラスです。 - 同様の
for...in列挙構文。
Objective-C との違いは次のとおりです。
- ステートメントはセミコロン ( ) で終わる必要はありません
;が、1 行に複数のステートメントを許可するにはセミコロンを使用する必要があります。 - ヘッダーファイルがありません。
- 型推論を使用します。
- ジェネリックプログラミング。
- 関数はファーストクラスオブジェクトです。
- 列挙ケースには、関連付けられたデータ (代数データ型) を含めることができます。
- 演算子はクラスに対して再定義することができ (演算子オーバーロード)、新しい演算子を定義することもできます。
- 文字列はUnicode を完全にサポートしています。ほとんどの Unicode 文字は識別子または演算子で使用できます。
- 例外処理はありません。Swift 2では、異なる互換性のないエラー処理モデルが導入されています。[ 108 ]
- 誤用されやすい
以前のC ファミリ言語のいくつかの機能は削除されました。
- ポインタはデフォルトでは公開されません。プログラマーが参照または逆参照のために名前を追跡したりマークしたりする必要はありません。
i = 0代入は値を返しません。これにより、 の代わりに と書くというよくある間違いi == 0(コンパイル時エラーが発生する)を回避できます。breakブロック内でステートメントを使用する必要はありませんswitch。ステートメントを使用しない限り、個々のケースは次のケースに渡されませんfallthrough。- 変数と定数は常に初期化され、配列の境界は常にチェックされます。
- C言語では符号付き整数に対して未定義の動作を引き起こす整数オーバーフローは、 Swiftでは実行時エラーとしてトラップされます。プログラマーは、特別な算術演算子
&+、&-、&*、&/を使用することで、オーバーフローを許可するかどうかを選択できます。Swiftでは、すべての整数型に対して およびという&%プロパティが定義されており、外部ライブラリで各型に定義された定数に頼るのではなく、潜在的なオーバーフローを安全にチェックするために使用できます。minmax - ステートメントを囲む中括弧を省略できる
ifおよびの 1 ステートメント形式はサポートされていません。while - Cスタイルの列挙は、 off-by-oneエラー
for (int i = 0; i < c; i++)が発生しやすいため、サポートされていません(Swift 3以降)。[ 109 ] - 前後の増分・減分演算子(
i++、--i...)はサポートされていません(Swift 3以降)。CスタイルのforステートメントもSwift 3以降はサポートされていないため、さらにサポートされていません。[ 110 ]
開発およびその他の実装
[編集]SwiftはLinux上で動作するため、サーバーサイド言語として使われることもあります。[ 111 ] IBMのKitura(現在は廃止)、Perfect、Vapor、HummingbirdなどのWebフレームワークも開発されています。
Appleは公式の「サーバーAPI」作業グループも立ち上げており[ 112 ] 、 Swift開発者コミュニティのメンバーが中心的な役割を果たしている。[ 113 ]
Cocoa、Microsoftの共通言語基盤(.NET Framework、現在は.NET)、JavaおよびAndroidプラットフォームをターゲットとしたSwiftの2番目の無料実装は、 RemObjects SoftwareのElements Compilerの一部として存在します。[ 114 ]
Swiftのサブセットは、Arduino [ 115 ]やMac OS 9 [ 116 ]などの追加のプラットフォームに移植されています。
参照
[編集]- Swiftソフトウェアとツールのリスト
- プログラミング言語の比較
- Objective-C
- D(プログラミング言語)
- Kotlin(プログラミング言語)
- Nim(プログラミング言語)
- Python(プログラミング言語)
- レルム(データベース)
参考文献
[編集]- ^ 米国特許第9329844号
- ^ 「Swiftが1.0に到達」 Apple、2014年9月9日。 2015年3月8日閲覧。
- ^ 「リリース 6.2.1」 2025年11月4日. 2025年11月6日閲覧。
- ^ 「Swift、客観的に」。ドクター・ドブス。Swift
はプロプライエタリかつクローズドです。完全にAppleによって管理されており、オープンソース実装は存在しません。
- ^ Lattner, Chris (2014年6月11日). 「Re: [LLVMdev] [cfe-dev] [広告] AppleのSwiftコンパイラチームに募集」 . 2014年7月14日時点のオリジナルよりアーカイブ。 2014年6月12日閲覧。
多くの人がSwiftをオープンソース化し、LLVMの一部にすることを望んでいることは想像に難くありませんが、議論はまだ行われておらず、当分の間は行われないでしょう。
- ^ 「Chris Lattnerのホームページ」。Chris Lattner。2014年6月3日。 2014年6月3日閲覧。Swift
言語は、言語専門家、ドキュメンテーションの達人、コンパイラ最適化の達人、そしてアイデアの洗練と実戦テストに役立つフィードバックを提供してくれた非常に重要な社内ドッグフーディンググループのたゆまぬ努力の成果です。もちろん、この分野の多くの言語が苦労して得た経験からも大きな恩恵を受けており、Objective-C、Rust、Haskell、Ruby、Python、C#、CLUなど、数え切れないほど多くの言語からアイデアを得ています。
- ^ a b Lattner, Chris (2014年6月3日). 「Chris Lattnerのホームページ」 . Chris Lattner . 2014年6月3日閲覧.
私は2010年7月にSwiftプログラミング言語の開発を始めました。基本的な言語構造の大部分を実装しましたが、その存在を知っている人はごくわずかでした。2011年後半には、さらに数人の(素晴らしい)人々が本格的に貢献し始め、2013年7月にはApple Developer Toolsグループの主要な焦点となりました [...]
Objective-C
、Rust、Haskell、Ruby、Python、C#、CLU、その他数え切れないほど多くの言語からアイデアを得ています。
- ^ 「Swiftでassert()を構築する、パート2:__FILE__と__LINE__」 。 2014年9月25日閲覧。
- ^ 「影響 - Rustリファレンス」 . doc.rust-lang.org . 2020年5月2日閲覧。
- ^ "influenced by - V documentation" . github.com . 2023年11月3日閲覧。
- ^ 「Mojo言語FAQ」 . modular.com . 2025年8月17日閲覧。
- ^ 「Carbon Language GitHub」 . github.com . 2025年8月17日閲覧。
- ^ Lardinois, Frederic (2014年6月2日). 「Apple、iOSおよびOS Xアプリ開発のための新プログラミング言語Swiftを発表」 . TechCrunch . 2022年9月7日閲覧。
- ^ Swift でのプロトコル指向プログラミング. Apple Inc . YouTube . 2023年7月16日時点のオリジナルよりアーカイブ。 2015年6月18日閲覧。
- ^ 「コンセプトは Rust Traits、(たぶん) Swift Protocols、Haskel Type C に似ています... | Hacker News 」。news.ycombinator.com 。
- ^ ウィリアムズ、オーウェン (2014年6月2日). 「ティム・バーナーズ=リーの60歳の誕生日に、AppleがiOS向けの新プログラミング言語Swiftを発表」 . The Next Web . 2014年6月2日閲覧。
- ^ 「Appleの新しいプログラミング言語Swiftがオープンソース化」 The Verge、2015年12月3日。 2015年12月5日閲覧。
- ^ 「Apple、企業向け最新プレゼンでSwiftをオープンソース化」 CIO Journal、ウォール・ストリート・ジャーナル・ブログ、2015年12月3日。 2015年12月5日閲覧。
- ^ a b プラットフォームの現状報告、セッション102、Apple Worldwide Developers Conference、2014年6月2日
- ^ The Swift Programming Language . Apple . 2014年6月2日. 2014年6月2日閲覧。
- 「ドキュメント」 . Swift .
- ^ 「Swift Has Reached 1.0」 2014年9月9日. 2014年9月10日閲覧。
- ^ 「Xcode 6.1 リリースノート」 2014年10月22日. 2015年1月23日閲覧。
- ^ 「Xcode 6.3 リリースノート」 2015年4月8日. 2015年4月8日閲覧。
- ^ 「App Store の Swift 2 アプリ」。Swiftブログ。2016年3 月 13 日閲覧。
- ^ “Swift 3.0 Released!” . Swift.org . 2016年9月13日. 2016年10月14日時点のオリジナルよりアーカイブ。2016年10月26日閲覧。
- ^ 「Swift 3を振り返り、Swift 4の展望」 Swiftフォーラム、2016年7月29日。 2018年11月19日閲覧。
- ^ "Swift-Evolution" . Swift Evolution . 2018年11月19日閲覧。
- ^ “Swift 4.0 Released!” . Swift.org . 2017年9月17日. 2019年3月28日時点のオリジナルよりアーカイブ。2018年3月1日閲覧。
- ^ “Swift 4.1 Released!” . Swift.org . 2018年3月29日. 2019年4月25日時点のオリジナルよりアーカイブ。 2018年3月30日閲覧。
- ^ 「RedMonkプログラミング言語ランキング:2018年1月 – tecosystems」 redmonk.com 、 2018年3月7日。 2018年11月20日閲覧。
- ^ Kremenek, Ted (2019年3月25日). 「Swift 5 リリース!」 .
- ^ Kremenek, Ted (2019年9月20日). “Swift 5.1 Released!” . 2022年2月26日時点のオリジナルよりアーカイブ。2019年10月28日閲覧。
- ^ Hudson, Paul (2021年6月6日). 「What's new in Swift 5.5?」 . HackingWithSwift.com . Hacking with Swift . 2021年6月8日閲覧。
- ^ 「Swift 5.9 リリース」 . Swift.org . 2023年9月18日. 2023年10月9日閲覧。
- ^ Borla, Holly (2024年9月17日). 「Swift 6の発表」 . Swift.org . 2024年10月15日閲覧。
- ^ Borla, Holly (2025年3月31日). “Swift 6.1 Released 6.1” . swift.org . 2025年4月29日閲覧。
- ^ 「Stack Overflow開発者アンケート2015」。Stack Overflow。
- ^ 「Stack Overflow開発者アンケート2016結果」。Stack Overflow。
- ^ 「Swift.orgとオープンソース」 Swift.orgApple Inc. 2019年2月25日閲覧。
- ^ 「IBM Swift Sandboxの紹介 — Swift」 . Swift . 2015年12月5日閲覧。
- ^ Mayo, Benjamin (2015年12月4日). 「IBM Swift Sandboxを使ってWebブラウザでSwiftコードを書く」 . 9to5Mac . 2015年12月5日閲覧。
- ^ 「Appleがオープンソース化した後、IBMはSwiftプログラミングをクラウドに導入」 ZDNet 2015年12月5日閲覧。
- ^ 「Swift Package CatalogとSwift Sandboxの廃止」。2018年11月9日閲覧。
- ^ 「Swift Playgrounds」 . Apple Developer . 2016年6月19日閲覧。
- ^ 「Swift Playgrounds — プレビュー」 . Apple . 2016年6月19日閲覧。
- ^ Mayo, Benjamin (2016年6月13日). 「Apple、WWDCでiPad向けSwift Playgroundsを発表、一般公開は秋」 . 9to5Mac . 2016年6月19日閲覧。
- ^ Cunningham, Andrew (2017年1月10日). 「長年AppleプログラマーでありSwiftの開発者でもある人物がAppleを離れ、Teslaに移籍」 Ars Technica.
- ^ Wuerthele, Mike (2017年1月13日). 「Swiftプロジェクトの新責任者、テッド・クレメネック氏がしばらくの間、舞台裏でプロジェクトを統括すると報道」 . AppleInsider.
- ^ Daniel Eran Dilger (2019年6月19日). 「WWDC19: SwiftUIは新しいアイデアの銀河の中で最も明るい星だった」 . AppleInsider . 2019年7月19日閲覧。
- ^ 「Swift.org - Swiftをダウンロード」。2020年6月21日閲覧。
- ^ 「Swift用Android SDK」 . GitHub . 2021年9月10日閲覧。
- ^ 「swift-lang パッケージのバージョン」 。 2021年9月10日閲覧。
- ^ 「Swift SDK for Androidの発表」 Swift.org 2025年10月24日。
- ^ Readdle (2020年1月15日). 「Swift for Android: Our Experience and Tools」 . Medium . 2020年8月20日閲覧。
- ^ Anderson, Tim (2020年3月30日). 「Swift 5.3でWindows向けの公式カスタマイズサポートが約束:GUIを必要としないプラットフォームでSwiftが利用可能に」 The Register . 2020年9月18日閲覧。
- ^ 「The Swift Linux Port」 . Swift.org . Apple Inc. 2015年12月3日. 2016年8月3日閲覧。
- ^ Timmer, John (2014年6月5日). 「Appleの新しいプログラミング言語、Swiftをざっと見てみよう」 . Ars Technica . Condé Nast . 2014年6月6日閲覧。
- ^ Kremenek, Ted (2019年3月25日). 「Swift 5 リリース!」Swift.org . 2019年3月28日閲覧。
- ^ 「Swift をダウンロード」 . Swift.org . Apple . 2020年12月15日閲覧。
- ^ Kremenek, Ted (2021年4月26日). “Swift 5.4 Released!” Swift.org . Apple. 2021年4月26日時点のオリジナルよりアーカイブ。2021年4月26日閲覧。
- ^ Kremenek, Ted (2022年3月14日). “Swift 5.6 Released!” Swift.org . Apple . 2022年3月14日閲覧。
- ^ 「Swift 5.6.1 リリース · apple/Swift」 . GitHub .
- ^ 「Swift 5.6.2 リリース · apple/Swift」。GitHub 。
- ^ 「Swift 5.6.3 リリース · apple/Swift」 . GitHub .
- ^ Borla, Holly (2022年9月12日). 「Swift 5.7 リリース!」 . Swift.org . Apple . 2022年9月23日閲覧。
- ^ 「Swift 5.7.1 リリース · apple/Swift」 . GitHub .
- ^ 「Swift 5.8 リリース · apple/Swift」 . GitHub .
- ^ “Swift 5.8.1 Release · apple/swift” . GitHub . 2023年6月14日閲覧。
- ^ “Swift 5.9 Release · apple/swift” . GitHub . 2023年9月18日閲覧。
- ^ “Swift 5.9.1 Release · apple/swift” . GitHub . 2023年10月19日閲覧。
- ^ “Swift 5.9.2 Release · apple/swift” . GitHub . 2023年12月11日閲覧。
- ^ Borla, Holly (2024年3月5日). 「Swift 5.10 リリース」 . Swift.org . 2024年3月13日閲覧。
- ^ 「Swift 5.10.1リリース」 . GitHub . 2024年6月5日閲覧。
- ^ 「Swift 6.0リリース」 . GitHub . 2024年9月17日閲覧。
- ^ 「Swift 6.1リリース」 . GitHub . 2025年4月29日閲覧。
- ^ 「Swift 6.2リリース」 . GitHub . 2025年9月17日閲覧。
- ^ "ドキュメント" . docs.swift.org . 2023年11月17日閲覧。
- ^ 「Swift Concurrencyを使用してデータ競合を排除 - WWDC22 - ビデオ」 Apple Inc. 2023年11月17日閲覧。
- ^ a b 「ドキュメント」 . docs.swift.org . 2023年10月15日閲覧。
- ^ "ドキュメント" . docs.swift.org . 2023年10月15日閲覧。
- ^ 「クロージャ — Swiftプログラミング言語(Swift 5.5)」 . docs.swift.org . 2021年8月31日閲覧。
- ^ Macomber, Kyle; Yaskevich, Yavel; Gregor, Doug; McCall, John. 「Multiple Trailing Closures」 . GitHub . 2020年10月19日閲覧。
- ^ "ドキュメント" . docs.swift.org . 2023年10月16日閲覧。
- ^ 「文字列と文字」 . docs.swift.org . 2023年10月16日閲覧。
- ^ 「宣言 — Swiftプログラミング言語(Swift 5.6)」 . docs.swift.org . 2022年2月28日閲覧。
- ^ 「アクセス制御」 . Swiftプログラミング言語. Apple Developer . 2016年10月25日閲覧。
- ^ 「Null許容型」、C#プログラミング ガイド、Microsoft。2017年2月21日アーカイブ、 Wayback Machine。
- ^ 「型」 . Swiftプログラミング言語. Apple Developer . 2014年7月16日閲覧。
- ^ a b 「クラスと構造体」。Swiftプログラミング言語。Apple Developer。2016年3月25日時点のオリジナルよりアーカイブ。
- ^ Guhit, Fiel (2015年2月14日). 「Swift 1.1、Swift 1.2、Objective-Cのパフォーマンスケーススタディ」 . Medium . 2023年12月12日時点のオリジナルよりアーカイブ。
- ^ 値型を使ったより良いアプリの構築. Apple. 2015年6月21日時点のオリジナルよりアーカイブ。
- ^ "Extensions" . docs.swift.org . 2023年11月28日閲覧。
- ^ 「プロトコルの操作」。Objective -Cによるプログラミング。Apple開発者ドキュメントアーカイブ。2014年9月17日。2016年4月29日時点のオリジナルよりアーカイブ。
- ^ 「NSCopyingプロトコルリファレンス」。Apple 。
- ^ 「Swift標準ライブラリの統計」 . swiftinit.org . Swiftinit . 2023年10月2日閲覧。
- ^ Thompson, Mattt (2014年9月2日). 「Swiftデフォルトプロトコル実装」 . NSHipster .
- ^ “swift-evolution/proposals/0304-structured-concurrency.md at main · apple/swift-evolution” . GitHub . 2023年10月16日閲覧。
- ^ “swift-evolution/proposals/0296-async-await.md at main · apple/swift-evolution” . GitHub . 2023年10月16日閲覧。
- ^ 「SwiftベースのアプリはmacOS 10.9/iOS 7以下で動作しますか?」、StackOverflow
- ^ Sandberg, Alexander; Boria, Holly (2023年9月18日). 「Swift 5.9 リリース」 . Swift.org . Apple . 2023年10月9日閲覧。
- ^ 「Objective-C の動作を使用して Swift クラスを作成する」、Apple Inc.
- ^ 「Objective-C コードを Swift に移行する」 Apple開発者ドキュメント。
- ^ 「同じプロジェクトでの Swift と Objective-C」、Apple Inc.
- ^ 「Apple: 「corelib」を検索」" . GitHub .
- ^ 「Xcode - SwiftUI - Apple Developer」 . developer.apple.com . 2021年2月1日閲覧。
- ^ Lanier, Brian; Groff, Joe. 「Intermediate Swift」 . Apple . 2014年7月3日閲覧。
- ^ メッツ、ケイド「なぜプログラマーたちはAppleの新しいプログラミング言語に夢中になっているのか」 Wired誌。2014年7月16日閲覧。
- ^ 「Swift言語でのエラー処理」。stackoverflow.com 。
- ^ "apple/swift-evolution" . GitHub . 2016年4月4日閲覧。
- ^ "apple/swift-evolution" . GitHub . 2016年4月4日閲覧。
- ^ Barbosa, Greg (2016年2月22日). 「IBM、Swiftをクラウドに導入、Appleのプログラミング言語で書かれたウェブフレームワークKituraをリリース」 . 9to5Mac . 2016年5月16日閲覧。
- ^ 「Server APIs Work Group」 . Swift.org . 2016年10月25日. 2016年10月28日閲覧。
- ^ “Swift.org” . Swift.org . 2021年5月10日時点のオリジナルよりアーカイブ。 2016年10月28日閲覧。
- ^ 「RemObjects Elements Compiler」 . 2016年1月17日閲覧。
- ^ 「Arduino 用 Swift」。
- ^ ローズ、ジョーダン (2020年4月1日). 「Mac OS 9 上の Swift」。-dealloc。