ロゴ | |
| パラダイム | マルチパラダイム:プロトコル指向、オブジェクト指向、関数型、命令型、ブロック構造、宣言型、並行型 |
|---|---|
| デザイン: | クリス・ラトナー、ダグ・グレガー、ジョン・マッコール、テッド・クレメネック、ジョー・グロフ、アップル社[1] |
| 開発者 | Apple Inc.とオープンソース貢献者 |
| 初登場 | 2014年6月2日[2] |
| 安定リリース | 6.0 [3]
/ 2016年5月3日 |
| プレビューリリース | 6.0
|
| タイピングの規律 | 静的、強い、推測 |
| メモリ管理 | 自動参照カウント |
| 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] | |
| 影響を受けた | |
| さび、[9] V(Vlang)[10] | |
Swiftは、 2010年にChris LattnerによってApple社向けに開発され、オープンソースコミュニティによって維持されている、高水準の 汎用、マルチパラダイム、コンパイル型 プログラミング言語です。Swiftはマシンコードにコンパイルされ、 LLVMベースのコンパイラを使用します。Swiftは2014年6月に初めてリリースされ[11] 、Swiftツールチェーンは2014年にリリースされたバージョン6以降、 Xcodeに同梱されています。
Apple は、 Objective-Cに関連する多くのコア概念、特に動的ディスパッチ、広範囲にわたる遅延バインディング、拡張可能なプログラミング、および同様の機能を、より「安全な」方法でSwift がサポートし、ソフトウェアのバグを見つけやすくすることを意図していました。Swift には、ヌルポインターの 参照解除などの一般的なプログラミングエラーに対処する機能があり、ピラミッドオブドゥームを回避するのに役立つ糖衣構文を提供しています。Swift は、型、構造体、クラスに適用できる拡張システムであるプロトコル拡張性の概念をサポートしています。Apple はこれを、プログラミングパラダイムの真の変化として推進しており、彼らはこれを「プロトコル指向プログラミング」と呼んでいます[12] (特性や型クラスに似ています)。[13]
Swiftは、2014年のAppleのWorldwide Developers Conference (WWDC)で発表されました。[14] 2014年にはバージョン1.2にアップグレードされ、2015年のWWDCではSwift 2にメジャーアップグレードされました。当初はプロプライエタリ言語でしたが、バージョン2.2は2015年12月3日にApache License 2.0の下でAppleのプラットフォームとLinux向けにオープンソースソフトウェアになりました。[15] [16]
バージョン3.0を通じてSwiftの構文は大きな進化を遂げ、コアチームは後のバージョンでソースの安定性に重点を置きました。[17] [18] 2018年第1四半期には、Swiftは人気度でObjective-Cを上回りました。[19]
2017年にリリースされたSwift 4.0では、組み込みクラスと構造にいくつかの変更が導入されました。以前のバージョンのSwiftで書かれたコードは、Xcodeに組み込まれている移行機能を使用して更新できます。2019年3月にリリースされたSwift 5では、Appleプラットフォーム上で安定したバイナリインターフェースが導入され、SwiftランタイムをAppleオペレーティングシステムに組み込むことができるようになりました。Swift 4とソース互換性があります。[20]
Swift 5.1は2019年9月に正式にリリースされました。Swift 5.1は、モジュール安定性の導入により、言語の安定した機能をコンパイル時に拡張することで、Swift 5の前のバージョンを基盤としています。モジュール安定性の導入により、Swiftの将来のリリースで動作するバイナリフレームワークを作成して共有することが可能になりました。[21]
2021年のWWDCでAppleが公式に発表したSwift 5.5では、並行性と非同期コードの言語サポートが大幅に拡張され、特にアクターモデルの独自バージョンが導入されています。[22]
Swift 5.9は2023年9月にリリースされ、マクロシステム、汎用パラメータパック、新しいconsume演算子のような所有権機能が含まれています。[23]
現在のバージョンであるSwift 5.10は、2024年3月にリリースされました。このバージョンでは、言語の並行性モデルが改善され、完全なデータ分離が可能になり、データ競合を防止できます。また、Swift 6の前の最後のリリースでもあります。 [24]バージョン5.10は現在、macOS、Windows、Linuxで利用できます。[25]
歴史
Swiftの開発は2010年7月にクリス・ラトナーによって開始され、最終的にはAppleの他の多くのプログラマーの協力を得た。Swiftは、1980年代初頭からほとんど変更されておらず、現代的な言語機能を欠いていたAppleの以前のプログラミング言語Objective-Cの代替品の必要性に動機づけられた。Swiftは「 Objective-C、Rust、Haskell、Ruby、Python、C#、CLU、その他数え切れないほど多くの言語のアイデアを取り入れた」。[7] 2014年6月2日、Apple Worldwide Developers Conference (WWDC)アプリケーションは、Swiftで書かれた最初の公開アプリとなった。[26]プログラミング言語のベータ版は会議でAppleの登録開発者にリリースされたが、同社はSwiftの最終版がテストバージョンとソースコード互換性があるとは約束しなかった。Appleは、完全リリースで必要であればソースコードコンバーターを利用できるようにすることを計画していた。[26]
500ページの無料マニュアルであるSwiftプログラミング言語もWWDCでリリースされ、Apple Books Storeと公式ウェブサイトで入手できます。[27]
Swiftは2014年9月9日、iOS向けXcode 6.0のゴールドマスターで1.0マイルストーンに到達しました。[28] Swift 1.1は、Xcode 6.1のリリースと同時に2014年10月22日にリリースされました。[29] Swift 1.2は、Xcode 6.3とともに2015年4月8日にリリースされました。[30] Swift 2.0はWWDC 2015で発表され、2015年9月21日にApp Storeでアプリを公開できるようになりました。[31] Swift 3.0は2016年9月13日にリリースされました。[32] Swift 4.0は2017年9月19日にリリースされました。[33] Swift 4.1は2018年3月29日にリリースされました。[34]
Swiftは、2015年のStack Overflow開発者調査で最も愛されているプログラミング言語の第1位を獲得しました[35]。 2016年には第2位を獲得しました[36]。
2015年12月3日、Swift言語、サポートライブラリ、デバッガ、パッケージマネージャがランタイムライブラリ例外付きのApache 2.0ライセンスの下でオープンソース化され、[37]プロジェクトをホストするためにSwift.orgが作成されました。ソースコードはGitHubでホストされており、誰でも簡単にコードを入手して自分でビルドしたり、プルリクエストを作成してプロジェクトにコードを貢献したりすることができます。
2015年12月、IBMはSwift Sandboxウェブサイトを発表しました。これにより、開発者は1つのペインでSwiftコードを記述し、別のペインに出力を表示することができます。[38] [39] [40] Swift Sandboxは2018年1月に廃止されました。[41]
2016年のWWDCで、AppleはSwiftでコーディングする方法を教えることを目的としたiPad専用アプリ「Swift Playgrounds」を発表しました。このアプリは3Dビデオゲームのようなインターフェースで表示され、コード行が特定の順序で配置され実行されるとフィードバックが提供されます。[42] [43] [44]
2017年1月、クリス・ラトナーはアップルを離れ、テスラモーターズに転職することを発表し、Swiftプロジェクトのリーダーの役割はチームのベテランであるテッド・クレメネックに引き継がれた。[45] [46]
WWDC 2019で、AppleはXcode 11を搭載したSwiftUIを発表しました。これは、すべてのAppleプラットフォームにわたる宣言的なUI構造設計のフレームワークを提供します。 [47]
LinuxのUbuntuディストリビューション用のSDKとツールチェーンの公式ダウンロードはSwift 2.2から利用可能で、Swift 5.2.4、CentOS、Amazon Linux以降ではさらに多くのディストリビューションが追加されました。[48] Android用の非公式SDKとネイティブツールチェーンパッケージもあります。[49] [50]
プラットフォーム
Swiftがサポートするプラットフォームは、Appleのオペレーティングシステム(Darwin、iOS、iPadOS、macOS、tvOS、watchOS)、Linux、Windows、Androidです。[51] [52]
Swiftの設計上の重要な側面は、過去数十年にわたってApple製品向けに開発されたCocoaやCocoa Touch フレームワークなどの膨大な既存のObjective-Cコードと相互運用できることです。Appleプラットフォームでは、[53] Objective-Cランタイムライブラリとリンクしており、これによりC、Objective-C、C++、Swiftのコードを1つのプログラム内で実行できます。[54]
バージョン履歴
特徴
Swift は、最新のプログラミング言語理論の概念を採用し、シンプルでありながら強力な構文を提供することを目指した汎用プログラミング言語です。Swift は、Apple プラットフォームの主要な開発言語として置き換えられた Objective-C から大きな影響を受け、さまざまなプログラミング言語の革新と慣習を取り入れています。
Swift は、速度を犠牲にすることなく、初心者プログラマーにとって安全で使いやすいように設計されました。デフォルトでは、Swift はすべてのメモリを自動的に管理し、変数が使用前に常に初期化されるようにします。配列アクセスは範囲外エラーがないかチェックされ、整数演算はオーバーフローがチェックされます。パラメータ名を使用すると、明確な API を作成できます。プロトコルは型が採用できるインターフェースを定義し、拡張機能を使用すると、開発者は既存の型にさらに機能を追加できます。Swift は、クラス、サブタイプ、メソッドのオーバーライドをサポートし、オブジェクト指向プログラミングを可能にします。オプションを使用すると、 nil値を明示的に安全に処理できます。並行プログラムはasync/await構文を使用して記述でき、アクターは共有された可変状態を分離してデータ競合を排除します。[71] [72]
基本的な構文
Swiftの構文はCスタイルの言語に似ています。コードはデフォルトでグローバルスコープで実行を開始します。[73]また、この属性を構造体、クラス、または列挙型の宣言に適用して、プログラムのエントリポイントが含まれていることを示すこともできます。[74]@main
Swift の「Hello, World!」プログラムは次のとおりです。
印刷( "Hello, world!" )
ここで使用されている関数は Swift の標準ライブラリに含まれており、外部モジュールをインポートすることなくすべてのプログラムで使用できます。Swift の文はセミコロンで終わる必要はありませんが、同じ行に書かれた複数の文を区切るにはセミコロンが必要です。1 行コメントはで始まり、現在の行の終わりまで続きます。複数行コメントはと文字で囲まれます。定数は キーワードで宣言され、変数はキーワードで宣言されます。値は読み取られる前に初期化する必要があります。値は、提供された初期値の型に基づいて型を推測できます。初期値が値の宣言後に設定された場合、型を明示的に宣言する必要があります。[73]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 ステートメントはブール値のパラメータを受け取り、条件が true の場合は if ステートメントの本体を実行し、そうでない場合はオプションのelse本体を実行します。syntax は、オプションの値の存在を確認し、同時にそれをアンラップするための糖衣構文を提供します。if-let
someNumber = 42とする
if someNumber % 2 == 0 { // 剰余演算子を使用して、someNumber を 2 で割った余りを計算します。
print ( " \( someNumber )は偶数です。" )
} それ以外 {
print ( " \( someNumber )は奇数です。" )
}
// 「42 は偶数です。」と出力します。
関数はキーワードで定義されます。関数パラメータには、関数呼び出しをフレーズのように読める名前が付けられます。パラメータ名の前にアンダースコアを付けると、呼び出しサイトから引数ラベルを省略できます。タプルは、関数で複数のデータを一度に返すために使用できます。func
funcconstructGreeting ( forname : String ) - > String {
「Hello \( name ) !」を返します
}
greeting = constructGreeting (対象: "Craig" )とします。
print ( greeting ) // 「Hello Craig!」と出力します。
関数、およびクロージャと呼ばれる匿名関数は、プロパティに割り当てて、他の値と同様にプログラム内で渡すことができます。
func DivisionByTwo ( _ aNum : Int ) -> Int {
aNum / 2を返す
}
関数 multiplyByTwo ( _ aNum : Int ) -> Int {
aNum * 2を返す
}
数学演算 = 乗算 2 とします
print ( mathOperation ( 21 )) // 「42」と出力します
ステートメントは、指定された条件が真である場合に限り、ステートメントを過ぎて続行されます。guardそうでない場合は、指定された節の本体guardが実行されます。節は、ステートメントが出現するelseコード ブロックの制御を終了する必要があります。ステートメントは、プログラムの実行を続行する前に、特定の要件が満たされていることを確認するのに役立ちます。特に、ステートメントは、囲むスコープの残りの部分で nil 以外であることが保証されるオプション値のラップされていないバージョンを作成するために使用できます。elseguardguard
func division (分子: Int ?, byDenominator 分母: Int ) -> Int ? {
ガード 分母 != 0 else {
print ( "0で割ることはできません。" )
nilを返す
}
ガード let 分子 else {
print ( "指定された分子は nil です。" )
nilを返す
}
分子 / 分母を返す
}
結果 = 除算(分子: 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 = [ "ウィル" 、 "アンナ" 、 "バート" ]とします。
名前内の name {
印刷(名前)
}
// 印刷:
// 意思
// アンナ
// バート
whileループは、指定されたブール条件が次のように評価される限り繰り返されますtrue。
// 1 から 5 までのすべての数字を合計します。
変数 i = 1
var 結果 = 0
while i <= 5 { // i が 5 以下の限り、ループは本体を実行します。
result += i // 現在の結果に i を追加します。
i += 1 // i を 1 増やします。
}
print ( result ) // "15" を出力します
閉鎖サポート
Swiftはクロージャをサポートしています。クロージャは、コード内で渡したり使用したりできる自己完結型の機能ブロックであり、[75]匿名関数として使用することもできます。次に例を示します。
// 入力値と出力値によって定義されるクロージャ型は、クロージャの外部で指定できます。
クロージャ 1 : ( Int , Int ) - > Int = { arg1 , arg2in
引数1 + 引数2を返す
}
// …またはその内部:
クロージャ2 = { ( 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は複数の末尾クロージャをサポートしています。[76]
// この関数は、最初のクロージャの戻り値を 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はインラインクロージャに省略形の引数名を提供するため、クロージャパラメータのすべてを明示的に命名する必要がなくなります。[77]引数は$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 += "世界!"
文字列補間は、他の値や式から新しい文字列を作成することを可能にします。括弧で囲まれた値は、\囲まれた文字列リテラルに挿入されます。[78]
var currentScore = 980
print ( "あなたのスコアは\( currentScore )です。" )
// 「あなたのスコアは 980 です。」と出力します。
for-in ループを使用して、文字列に含まれる文字を反復処理できます。
「Swift」の文字 の場合{ print (文字) } // S // w // i // f // t
Foundation フレームワークがインポートされると、Swift は String 型を Objective-C で一般的に使用される String クラスである NSString に目に見えない形でブリッジします。
呼び出し可能なオブジェクト
Swiftでは、呼び出し可能なオブジェクトはを使用して定義されますcallAsFunction。[79]
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 つのアクセス制御レベルをサポートしています。多くのオブジェクト指向言語とは異なり、これらのアクセス制御は継承階層を無視します。は、シンボルが直接のスコープ内でのみアクセス可能であることを示し、は、シンボルがファイル内からのみアクセス可能であることを示し、 は、シンボルが包含モジュール内からアクセス可能であることを示し、 は、どのモジュールからもアクセス可能であることを示し、(クラスとそのメソッドのみ)クラスがモジュール外でサブクラス化できることを示します。[80]openpublicinternalfileprivateprivateprivatefileprivateinternalpublicopen
オプションと連鎖
Swift の重要な機能はオプション型です。これにより、ポインターが特定の値を参照するか、まったく値を参照しないかのいずれかになる、Cの一般的なパターンと同様の方法で参照または値を操作できます。これは、オプションでない型ではnull ポインター エラーが発生しないことを意味します。コンパイラーは、これが不可能であることを保証できます。
オプショナル型は列挙型で作成されますOptional。null 許容の Integer を作成するには、 のような宣言を使用しますvar optionalInteger: Optional<Int>。C# と同様に、[81] Swift にはこれに対する糖衣構文も含まれており、型名の後に疑問符 を置くことで、変数がオプショナルであることを示すことができますvar optionalInteger: Int?。[82]オプショナルとしてマークされた変数または定数は、基になる型の値を持つか、 ですnil。オプショナル型は基本型をラップするStringため、異なるインスタンスが生成されます。と はString?根本的に異なる型で、前者は 型ですStringが、後者はOptional何らかの値を保持している可能性のあるですString。
内部の値にアクセスするには、それが nil ではないと仮定して、内部のインスタンスを公開するためにアンラップする!必要があります。これは、次の演算子を使用して実行されます。
myValue = anOptionalInstanceとします。someMethod ()
この場合、演算子は内部のインスタンスを公開するために!アンラップし、そのインスタンスに対してメソッド呼び出しを行えるようにします。 が nil の場合、null ポインター エラーが発生し、プログラムが終了します。これは強制アンラップと呼ばれます。オプションは、最初にインスタンスが nil かどうかをテストし、null でない場合はアンラップする
オプション チェーンを使用して安全にアンラップできます。anOptionalInstanceanOptionalInstance
myValue = anOptionalInstance ? .someMethod ()とします。
この場合、ランタイムはが nil でないsomeMethod場合にのみを呼び出しanOptionalInstance、エラーを抑制します。は、すべてのオプション プロパティの後に配置する必要があります。これらのプロパティのいずれかが nil の場合、式全体が nil として評価されます。チェーン?という用語の由来は、複数のメソッド呼び出し/ゲッターが連鎖されるより一般的なケースに由来しています。たとえば、次のようになります。
aTenant = aBuilding.tenantList [ 5 ]とし、theirLease = aTenant.leaseDetailsとし、leasingStart = theirLease ? .startDateとします。
次のように簡略化できます。
リース開始 = aBuilding.tenantList [ 5 ] .leaseDetails ? .startDateとする
Swift のオプションを使用すると、アンラッピング アクションがランタイム ディスパッチ システムで発生するのではなく、定義されたインスタンス (ラッパー) で呼び出されるため、 コンパイラは静的ディスパッチを使用できます。
値の種類
多くのオブジェクト指向言語では、オブジェクトは内部的に 2 つの部分で表現されます。オブジェクトはヒープ上に置かれたデータ ブロックとして格納され、そのオブジェクトの名前 (または「ハンドル」) はポインターで表現されます。オブジェクトはポインターの値をコピーすることによってメソッド間で渡され、コピーを持つすべてのユーザーがヒープ上の同じ基礎データにアクセスできます。対照的に、整数や浮動小数点値などの基本型は直接表現されます。ハンドルにはデータ (データへのポインターではありません) が含まれ、そのデータはコピーによって直接メソッドに渡されます。これらのアクセス スタイルは、オブジェクトの場合は参照渡し、基本型の場合は 値渡しと呼ばれます。
どちらの概念にも利点と欠点があります。オブジェクトは、ウィンドウの説明やドキュメントの内容など、データが大きい場合に便利です。このような場合、データへのアクセスは、データ構造全体をコピーするのではなく、32 ビットまたは 64 ビットの値をコピーすることによって提供されます。ただし、整数などの小さい値はポインタと同じサイズ (通常はどちらも 1ワード) であるため、値を渡す場合と比較してポインタを渡すことに利点はありません。
Swift は、参照渡しまたは値渡しのセマンティクスを使用するオブジェクトの組み込みサポートを提供します。前者はclass宣言を使用し、後者はを使用しますstruct。Swift の構造体は、メソッド、プロトコルの実装、拡張メカニズムの使用など、クラスとほぼ同じ機能を備えています。このため、Apple はすべてのデータをオブジェクトや値ではなく、総称的にインスタンスと呼んでいます。ただし、構造体は継承をサポートしていません。[83]
プログラマは、アプリケーション内の各データ構造に対して、どのセマンティクスがより適切であるかを自由に選択できます。ウィンドウなどの大きな構造はクラスとして定義され、ポインターとして渡すことができます。2D ポイントなどの小さな構造は構造体として定義でき、値渡しとなり、間接参照や参照カウントなしで内部データに直接アクセスできます。値渡しの概念に固有のパフォーマンスの向上により、Swift は、 や 、および通常はオブジェクトによって表される や などの型を含む、ほぼすべての一般的なデータ型にこれらの型を使用していますInt。[ Double83 ]値型を使用すると、ユーザー アプリケーションでも大幅なパフォーマンスの向上が得られます。[84]StringArray
Array、、DictionaryおよびはSetすべてコピーオンライトを利用しており、プログラムがそれらの値を変更しようとした場合にのみデータがコピーされます。これは、さまざまなアクセサが実質的に同じデータストレージへのポインタを持っていることを意味します。したがって、データは物理的にはメモリに1つのインスタンスとして保存されますが、アプリケーションレベルではこれらの値は別々であり、必要な場合にのみコピーオンライトによって物理的な分離が強制されます。[85]
拡張機能
拡張機能は、サブクラス化したり元のソースコードにアクセスしたりすることなく、既存の型に新しい機能を追加します。拡張機能は、新しいメソッド、初期化子、計算プロパティ、添え字、プロトコル準拠を追加できます。[86]一例として、基本String型にスペルチェッカーを追加すると、プログラム内のすべてのインスタンスで Stringスペルチェックが可能になります。このシステムは、関連するコードをライブラリのような拡張機能にまとめることができる組織化技術としても広く使用されています。
拡張機能はキーワードで宣言されますextension。
構造 体長方形 {
幅 : Double
高さ: Double
}
拡張子 長方形 {
var エリア: Double {
高さ * 幅を返す
}
}
プロトコル指向プログラミング
プロトコルは、特定の型が一連のメソッドまたはプロパティを実装することを約束します。つまり、システム内の他のインスタンスは、そのプロトコルを実装する任意のインスタンスでそれらのメソッドを呼び出すことができます。これは、機能セットが完全に同じというわけではありませんが、現代のオブジェクト指向言語では多重継承の代替としてよく使用されます。
Objective-Cやプロトコルの概念を実装している他のほとんどの言語では、各クラスに必要なメソッドが実装されていることを確認するのはプログラマーの責任です。[87] Swiftでは、拡張機能を使用してこれらのメソッドを追加し、ジェネリックプログラミング(ジェネリック)を使用して実装する機能が追加されています。これらを組み合わせることで、プロトコルを一度記述するだけで、さまざまなインスタンスをサポートできます。また、拡張メカニズムを使用して、定義にそのプロトコルをリストしていないオブジェクトにプロトコル準拠を追加することもできます。[88]
たとえば、プロトコルは と呼ばれ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%がプロトコル要件またはデフォルトの実装でした。[89]たとえば、Swiftは拡張機能を使用して、Equatable文字列や配列などの多くの基本型にプロトコルを追加し、演算子で比較できるようにしています==。Equatableプロトコルでは、このデフォルトの実装も定義されています。
関数 !=< T : Equatable >( lhs : T , rhs : T ) -> Bool
この関数は、に適合する任意のインスタンスに対して機能するメソッドを定義しEquatable、等しくない演算子を提供します。任意のインスタンス、クラス、または構造体は、に適合するだけで自動的にこの実装を取得しますEquatable。[90]
プロトコル、拡張機能、ジェネリックを組み合わせて、洗練された API を作成できます。たとえば、制約を使用すると、採用する型の特性に基づいて、型が条件付きでプロトコルまたはメソッドを採用できます。一般的な使用例としては、コレクション内に含まれる要素が次の場合にのみ、コレクション型にメソッドを追加することが挙げられますEquatable。
拡張 配列 where Element : Equatable {
// allEqual は、Equatable 要素を含む配列のインスタンスに対してのみ使用できます。
func allEqual () -> Bool {
for element in self {
if element != self . first {
return false
}
}
return true
}
}
同時実行性
Swift 5.5 では、構造化された並行性が言語に導入されました。[91]構造化された並行性は、Kotlin、JavaScript、Rust に似たAsync/awaitasync構文を使用します。非同期関数は、パラメータ リストの後のキーワードで定義されます。非同期関数を呼び出すときは、await関数の呼び出し中に実行が中断される可能性があることを示すために、関数の前にキーワードを記述する必要があります。関数が中断されている間、プログラムは同じプログラム内の他の並行関数を実行する可能性があります。この構文により、プログラムは潜在的な中断ポイントを明確に呼び出し、以前に広く使用されていたクロージャ コールバックによって引き起こされたピラミッド オブ ドゥーム (プログラミング)のバージョンを回避できます。[92]
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 {
ダウンロードテキストを待機 (名前: " someText" ) }
result = await taskHandle . value を実行します。
Swift は、可変状態を分離するためにアクター モデルを使用し、異なるタスクが共有状態を安全に変更できるようにします。アクターはactorキーワードで宣言され、クラスのような参照型です。アクターの可変状態に同時にアクセスできるのは 1 つのタスクだけです。アクターは自身の内部状態に自由にアクセスして変更できますが、別のタスクで実行されるコードは、await他のタスクがアクターの状態へのアクセスを完了するまでコードが中断される可能性があることを示すために、各アクセスを キーワードでマークする必要があります。
アクター ディレクトリ {
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にも依存します。[93] SwiftとObjective-Cのコードは1つのプログラムで使用でき、拡張によりCとC++も使用できます。Swift 5.9以降では、C++コードをSwiftコードから直接使用できます。[94] Objective-Cの場合、Swiftはオブジェクトモデルにかなりアクセスでき、Objective-Cコードをサブクラス化、拡張して使用してプロトコルサポートを提供できます。[95]逆は当てはまりません。SwiftクラスをObjective-Cでサブクラス化することはできません。[96]
このようなプログラムの開発と既存のコードの再利用を支援するために、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 からアクセスできなくなる場合があります。[97]
Swift では、開発環境によって読み取られるメタデータで、必ずしもコンパイルされたコードの一部ではない属性も限定的にサポートされています。Objective-C と同様に、属性は@構文を使用しますが、現在使用できるセットは少数です。1 つの例は@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」が含まれます。[98]
2019年現在、AppleはXcode 11でSwiftUIと呼ばれる新しい主要なUIパラダイムも追加しました。SwiftUIは、古いInterface Builderパラダイムを新しい宣言型開発パラダイムに置き換えます。[99]
メモリ管理
Swift は、メモリの管理に自動参照カウント(ARC)を使用します。クラスまたはクロージャのすべてのインスタンスは参照カウントを保持し、プログラムが保持している参照の数を継続的に集計します。このカウントが 0 に達すると、インスタンスは割り当て解除されます。この自動割り当て解除により、不要になったインスタンスはすぐに割り当て解除されるため、ガベージ コレクターは不要になります。
強い参照サイクルは、 2つのインスタンスが互いに強く参照し合う場合(例:AがBを参照し、BがAを参照)に発生する可能性があります。どちらのインスタンスの参照カウントもゼロになることはないため、どちらも解放されることはなく、メモリリークが発生します。Swiftは、強い参照サイクルを防ぐためにキーワード と を提供していますweak。unownedこれらのキーワードにより、参照カウントを増分せずにインスタンスを参照できます。weak参照は、変更されて になる可能性があるため、オプションの変数でなければなりませんnil。[100]すでに割り当てが解放された値にアクセスしようとすると、unowned実行時エラーが発生します。
クラス内のクロージャは、自己参照をキャプチャすることによって強い参照サイクルを作成することもできます。弱い参照または非所有参照として扱われる自己参照は、キャプチャ リストを使用して指定できます。
クラス Person {
名前 :文字列
弱い 変数 home : Home ? // 参照サイクルを断ち切るために弱い参照として定義されます。弱い参照は、参照先のインスタンスの参照カウントを増加しません。
init (名前: 文字列) {
自分.名前 = 名前
}
deinit { print ( "初期化解除された\( name ) " ) }
}
クラス ホーム {
アドレス :文字列
var 所有者: 人?
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 環境内で実行されるインタラクティブなビュー、またはコードやデバッガーの変更にオンザフライで応答するプレイグラウンドアプリによってさらに強化されています。 [101]プレイグラウンドを使用すると、プログラマーは 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では、異なる互換性のないエラー処理モデルが導入されています。[102]
- 誤用されやすい
以前のC ファミリ言語のいくつかの機能は削除されました。
- ポインタはデフォルトでは公開されません。プログラマーが参照または逆参照の名前を追跡してマークする必要はありません。
i = 0代入は値を返しません。これにより、 の代わりにを記述する一般的なエラーi == 0(コンパイル時エラーが発生する) を回避できます。breakブロック内でステートメントを使用する必要はありませんswitch。ステートメントが使用されない限り、個々のケースは次のケースに渡されませんfallthrough。- 変数と定数は常に初期化され、配列の境界は常にチェックされます。
- C 言語では符号付き整数に対して未定義の動作を引き起こす整数オーバーフローは、 Swift では実行時エラーとしてトラップされます。プログラマーは、特殊な算術演算子
&+、&-、&*、&/および を使用して、オーバーフローを許可することを選択できます。Swift では、すべての整数型に対して&%プロパティminおよびmaxが定義されており、外部ライブラリで各型に対して定義された定数に依存するのではなく、潜在的なオーバーフローを安全にチェックするために使用できます。 - ステートメントを囲む中括弧を省略できる
ifおよびの 1 ステートメント形式はサポートされていません。while - Cスタイルの列挙は、 off-by-oneエラーが
for (int i = 0; i < c; i++)発生しやすいため、サポートされていません(Swift 3以降)。[103] - 前後の増分および減分演算子(
i++、--i...)はサポートされていません(Swift 3以降)。CスタイルのforステートメントもSwift 3以降ではサポートされていないため、さらにサポートされていません。[104]
開発およびその他の実装
SwiftはLinux上で実行できるため、サーバーサイド言語として使用されることもあります。[105] IBMのKitura(現在は廃止)、Perfect、Vaporなど、いくつかのWebフレームワークがすでに開発されています。
Appleは公式の「サーバーAPI」作業グループも立ち上げており、[106] Swift開発者コミュニティのメンバーが中心的な役割を果たしている。[107]
Cocoa、Microsoftの共通言語基盤(.NET Framework、現在は.NET)、JavaおよびAndroidプラットフォームを対象としたSwiftの2番目の無料実装は、 RemObjects SoftwareのElements Compilerの一部として存在します。[108]
Swiftのサブセットは、 Arduino [109]やMac OS 9 [110]などの追加プラットフォームに移植されています。
参照
参考文献
- ^ 米国特許番号9329844
- ^ 「Swift が 1.0 に到達」。Apple。2014 年 9 月 9 日。2015 年3 月 8 日閲覧。
- ^ . 2024年9月17日 https://github.com/swiftlang/swift/releases/tag/swift-6.0-RELEASE.
{{cite web}}:欠落または空|title=(ヘルプ) - ^ 「客観的に見たSwift」。Swift
はプロプライエタリかつクローズドです。完全にAppleによって管理されており、オープンソースの実装はありません。
- ^ Lattner, Chris (2014 年 6 月 11 日). 「Re: [LLVMdev] [cfe-dev] [広告] Apple の Swift コンパイラ チームに募集」。2014 年 7 月 14 日時点のオリジナルよりアーカイブ。2014 年6 月 12 日閲覧。
私たちの多くが、これをオープン ソースにして LLVM の一部にしたいと考えていることは想像に難くありませんが、議論はまだ行われておらず、当分の間行われないでしょう。
- ^ 「Chris Lattner のホームページ」。Chris Lattner。2014 年 6 月 3 日。2014年6 月 3 日閲覧。Swift
言語は、言語の専門家、ドキュメンテーションの達人、コンパイラ最適化の達人、そしてアイデアの洗練と実戦テストに役立つフィードバックを提供してくれた非常に重要な社内ドッグフーディング グループのチームによるたゆまぬ努力の成果です。もちろん、この分野の他の多くの言語が苦労して得た経験からも大きな恩恵を受けており、Objective-C、Rust、Haskell、Ruby、Python、C#、CLU など、数え切れないほど多くの言語からアイデアを得ています。
- ^ ab 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 ドキュメント」. github.com . 2023 年11 月 3 日閲覧。
- ^ Lardinois, Frederic (2014年6月2日). 「Apple、iOSおよびOS Xアプリ作成用の新プログラミング言語Swiftを発表」TechCrunch . 2022年9月7日閲覧。
- ^ Swiftでのプロトコル指向プログラミング。Apple Inc. YouTube。
- ^ 「コンセプトは Rust の Traits に似ています」。
- ^ Williams, Owen (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日閲覧。
- ^ 「Swift 3 を振り返り、Swift 4 に向けて」。Swiftフォーラム。2016 年 7 月 29 日。2018 年11 月 19 日閲覧。
- ^ 「Swift-Evolution」。Swift Evolution 。2018年11月19日閲覧。
- ^ 「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日閲覧。
- ^ ab Borla, Holly (2024年3月5日). 「Swift 5.10がリリースされました」. Swift.org . 2024年3月13日閲覧。
- ^ "Swift.org". Swift.org . 2014年3月. 2024年4月28日閲覧。
- ^ ab プラットフォームの現状、セッション 102、Apple Worldwide Developers Conference、2014 年 6 月 2 日
- ^ Swiftプログラミング言語。Apple 。 2014年6月2日。2014年6月2日閲覧。
- 「ドキュメント」。Swift 。
- ^ 「Swift が 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 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日閲覧。
- ^ 「Stack Overflow 開発者調査結果 2015」。
- ^ 「Stack Overflow 開発者調査結果 2016」。
- ^ 「 Swift.orgとオープンソース」。Swift.org。Apple 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 パッケージカタログと Swift サンドボックスの廃止」 。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 プロジェクト責任者の Ted Kremenek 氏が、しばらくの間、舞台裏でショーを運営すると発表」。AppleInsider。
- ^ Daniel Eran Dilger (2019年6月19日). 「WWDC19: SwiftUIは新しいアイデアの銀河の中で最も明るい星でした」. AppleInsider . 2019年7月19日閲覧。
- ^ 「Swift.org - Swift をダウンロード」 。2020年6 月 21 日閲覧。
- ^ 「Android SDKs for Swift」。GitHub 。 2021年9月10日閲覧。
- ^ 「swift-lang パッケージのバージョン」 。2021年9 月 10 日閲覧。
- ^ 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 リリース!」. 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 リリース · apple/swift」。GitHub。2023年6月 14 日閲覧。
- ^ 「Swift 5.9 Release · apple/swift」。GitHub 。 2023年9月18日閲覧。
- ^ 「Swift 5.9.1 リリース · apple/swift」。GitHub。2023年10月 19 日閲覧。
- ^ 「Swift 5.9.2 リリース · apple/swift」。GitHub。2023年12月 11 日閲覧。
- ^ 「Swift 5.10.1 リリース」。GitHub 。 2024年6月5日閲覧。
- ^ 「Swift 6.0 リリース」。GitHub 。 2024年9月17日閲覧。
- ^ 「ドキュメント」. docs.swift.org . 2023年11月17日閲覧。
- ^ 「Swift Concurrency を使用してデータ競合を排除 - WWDC22 - ビデオ」。Apple Inc. 2023 年11 月 17 日閲覧。
- ^ ab “Documentation”. docs.swift.org . 2023年10月15日閲覧。
- ^ 「ドキュメント」. docs.swift.org . 2023年10月15日閲覧。
- ^ 「Closures — The Swift Programming Language (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日閲覧。
- ^ 「Nullable Types」、C# プログラミング ガイド、Microsoft。2017 年 2 月 21 日アーカイブ、Wayback Machine。
- ^ 「Types」。Swiftプログラミング言語。Apple Developer 。 2014年7月16日閲覧。
- ^ ab 「クラスと構造体」。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 日時点のオリジナルよりアーカイブ。
- ^ 「拡張機能」. docs.swift.org . 2023年11月28日閲覧。
- ^ 「プロトコルの操作」。Objective -C によるプログラミング。Apple Developer Documentation Archive。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
- ^ Inc、Apple (2023年9月18日). 「Swift 5.9がリリースされました」. Swift.org . 2023年10月9日閲覧。
{{cite web}}:|last=一般的な名前があります (ヘルプ) - ^ 「Objective-C の動作を備えた Swift クラスの記述」、Apple Inc.
- ^ 「Objective-C コードを Swift に移行する」。
- ^ 「同じプロジェクトでの 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 日閲覧。
- ^ Metz, Cade. 「なぜプログラマーたちは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 のプログラミング言語で書かれた Web フレームワーク 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」。
- ^ Rose, Jordan (2020 年 4 月 1 日). 「Mac OS 9 上の Swift」. -dealloc .
外部リンク
- 公式サイト
- Apple Developerにおける Swift
- GitHub上の Swift ソースコード
- Swift の例
- サーバーサイド Swift: Vapor フレームワーク
