Swift (プログラミング言語)

Swift(スウィフト)は、AppleiOSおよびmacOSLinuxWindowsで利用出来るプログラミング言語である。Worldwide Developers Conference (WWDC) 2014で発表された。Apple製OS上で動作するアプリケーションの開発に従来から用いられていたObjective-CやObjective-C++、C言語と共存できるように、共通のObjective-Cランタイムライブラリが使用されている[2]

Swift
Swift
Swiftのロゴ
パラダイム 関数型プログラミング命令型プログラミングオブジェクト指向プログラミング、マルチパラダイムプログラミング、block-structured programming、宣言型プログラミング ウィキデータを編集
登場時期 2014年6月2日 (2014-06-02)
開発者 クリス・ラトナー、Apple ウィキデータを編集
最新リリース 5.8.1 / 2023年6月1日[1]
型付け 強い静的型付け型推論
影響を受けた言語 RustHaskellRubyObjective-CPythonC SharpCLUC++JavaScalaSmalltalkGroovyD言語 ウィキデータを編集
プラットフォーム macOSiOSLinuxMicrosoft Windows 10iPadOStvOSWatchOSMicrosoft Windows ウィキデータを編集
ライセンス Apache-2.0、Apache License ウィキデータを編集
ウェブサイト
拡張子 swift ウィキデータを編集

Swiftは、動的ディスパッチ動的バインディング等のObjective-Cの特長を受け継いでいる一方で、Objective-Cより「安全」にバグを捕捉できることも意図している。また、タイプや構造体クラスに適用可能なプロトコルによるシステムの拡張性の概念は「プロトコル指向プログラミング」と呼ばれる[3]

Swiftは、マルチパラダイムのコンパイラプログラミング言語であるが、XcodeのPlaygroundsの上やターミナルでインタラクティブにデバッグする事が可能である。

LLVMコンパイラが使われており、ライブコーディングに対応していることが特徴[4]

歴史

Swiftは2010年にLLVMClangの始祖であるChris Lattnerによって開発が始められた。ChrisはSwiftについて「Objective-CRustHaskellRubyPythonC#CLU、その他多くの言語からアイデアを得た」と述べている[5]

その後Apple社内での4年間の開発期間を経て、2014年のWWDCにおいて一般に発表され、同時にAppleに開発者登録している開発者に対してベータ版の提供が開始された。

2014年9月9日、SwiftはXcode 6.0ゴールデンマスター版でマイルストーン1.0に到達した[6]

2015年12月3日、SwiftはApache 2.0ライセンスのもとでオープンソース化され、プロジェクトのホストとして Swift.org[※ 1] が作成された。

WWDC 2016の基調講演で、AppleはSwiftでのコード作成方法を教えることを目的とした、Swift Playgroundsという名称のiPad専用アプリ開発を発表した。2016年9月にリリースされた[7]このアプリは3Dビデオゲームのようなインタフェースで表示され、コードの行が特定の順序で配置され実行されたときにフィードバックを提供する。2017年3月21日、Swift 3.1に対応し、日本語を含め5カ国語に対応したことを発表[8]。Swift 3.1は、2017年3月27日にリリースされた[9]

2017年、Project Leadは、Chris Lattner同様にLLVMとClangの開発者である、AppleのTed Kremenekである[10]

2017年9月19日、Xcode 9.0とともにSwift 4がリリースされた[11]。組み込みのクラスやデータ構造に変更が加えられている。Swift 3で書かれたソースコードはXcodeに搭載された移行機能を使って更新できる。その後、2018年3月29日に、Xcode 9.3とともにSwift 4.1が[12]、2018年6月4日にXcode 10 betaとともにSwift 4.2がリリースされた[13]

2019年3月25日、Xcode 10.2とともにSwift 5がリリースされた。バイナリインタフェースの安定化が図られ、Appleが提供するOSにSwiftランタイムが標準で含まれることになる[14]。ソースコードはSwift 4.xと互換性がある。

WWDC 2019にて、Appleのプラットフォーム向けの新しいフレームワークとしてSwiftUIが提唱された[15]

2019年9月20日、Xcode 11.0とともにSwift 5.1がリリースされた。モジュールの安定化が図られ、Swiftの将来のバージョンで機能するバイナリフレームワークの作成、共有が可能になる[16]

2020年3月24日、Xcode 11.4とともにSwift 5.2がリリースされた[17]

2020年9月16日、Swift 5.3がリリースされ[18]、その約1週間後の9月22日、Windowsが公式にサポートされた[19]

2021年のWWDCで、Appleから正式に発表された Swift 5.5 は、同時実行非同期コードの言語サポートを大幅に拡張し、特に独自のバージョンのアクターモデルを導入している [20]

特徴

AppleはSwiftの発表に際して「モダン、安全、高速、インタラクティブ」を大きな特徴として挙げた[2]

モダン
クロージャタプルジェネリックプログラミングOptional型の採用などが挙げられる。
安全
静的な型チェック、変数の初期化の強制、数値型のオーバーフローの検査、自動参照カウントによるメモリ管理などが挙げられる。
また、if文のブレースの省略禁止、switch-case文は明示的に指定されない限りフォールスルーしないなど、既存のプログラミング言語において記述ミスによるバグが発生しやすかった部分を文法的に解決している。
インタラクティブ
Swiftはコンパイラ言語でありながら、インタプリタとしてスクリプトを実行することも可能で、対話実行環境 (REPL) も用意されている。
Swiftと同時に発表されたXcodeバージョン6では、コードの実行結果をグラフィカルに確認しながら開発できるPlaygroundsが実装された。

クレイグ・フェデリギは、Swiftの発表時に「C言語の荷物のないObjective-C」と表現している[2]

サンプルコード

Hello World

print( "Hello, World!" )  // これだけで動いて、Hello, World! と出力される。

/* 
 * コメントはCスタイルの複数行コメントと…
 */
// C++スタイルの一行コメントの双方をサポートしている

// var name: Type = value でType型の変数nameを宣言し、valueで初期化する
var explicitDouble: Double = 70 // 70.0
 
/// 型が省略された場合は、型推論により初期値の型が適用される
var implicitInteger = 70    // Int
var implicitDouble = 70.0   // Double
 
// let name:Type = value でType型の定数nameにvalueを設定する。
// 型推論可能な場合、型の表記は省略できる。
let theAnswer = 42

// 識別子にはたいていのUnicode文字を用いることができる。
let リンゴの数 = 3
let みかんの数 = 5

// 文字列リテラル"..."の中にある\(expr)には、式exprの内容が展開される
let リンゴ説明 = "私は\(リンゴの数)個のリンゴを持っている。"  // ”私は3個のリンゴを持っている。"
let 果物説明 = "私は\(リンゴの数 + みかんの数)個の果物を持っている。" //"私は8個の果物を持っている。"

// Swiftでは辞書も組み込みでサポートされている。
// 以下は Dictionary<String, Int> 型の定数辞書の定義の一例である。
let people = ["Anna": 67, "Bety": 8, "Jack": 33, "Sam": 25]

// 辞書の内容の列挙は for (key, value) in dict { ... }
for (name, age) in people {
    print("\(name) is \(age) years old.")
}

// メソッドや関数は "func"文法を使って宣言する。
// パラメータ名の付け方に注意。-> で戻り値の型を宣言する
func sayHello(to personName: String) -> String {
    let greeting = "こんにちは、" + personName + "さん"
    return greeting
}
// "こんにちは、サーバーさん"を出力
print(sayHello(to: "サーバー"))

メモリ管理 (Automatic Reference Counting)

Swiftでは自動参照カウント (Automatic Reference Counting) ARCでアプリが使うメモリを追跡管理する。ARCはクラスインスタンスが使われなくなった時に自動的にそれが使っていたメモリを開放する。Objective-Cで参照カウント方式を使用する場合のように、明示的にreleaseretainを記述する必要はなく、そもそも記述することができない。

循環参照を回避する方法として、Swiftでは弱い参照を示す修飾子weakunownedが提供される。また、キャプチャリストを使用して、クラス内のクロージャにおける強い参照サイクルを回避することができる[21]

相互運用性

SwiftはCocoaObjective-Cをシームレスに使えるように設計されている[22]。SwiftとObjective-Cの間はどちらのAPIからでもお互いに使う事が出来る。

モジュールとしてアクセス可能などんなObjective-Cフレームワーク(又はCライブラリ)でもSwiftに直接インポートできる。

import Foundation

初期化の例 Objective-C

UITableView *myTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];

Swift

let myTableView: UITableView = UITableView(frame: .zero, style: .Grouped)

Xcode 6以降では、Objective-CとSwiftの相互利用のためのブリッジヘッダーを生成する機能が提供される。ブリッジヘッダーファイルが生成された時点で、Swift側ではObjective-C側で定義された型、関数、変数を、Swiftで書かれたかのように参照できる[23]。Objective-C側では、自動生成ヘッダーファイルをインポートすることでSwiftコードを利用できる[24]。なお、Swiftで書かれたクラスをObjective-C側でサブクラス化することはできない[25]

C言語APIとの互換

SwiftからLibcを呼ぶ例

puts("Hello from libc")
let fd = open("/tmp/scratch.txt", O_WRONLY|O_CREAT, 0o666)

if fd < 0 {
    perror("could not open /tmp/scratch.txt")
} else {
    let text = "Hello World"
    write(fd, text, strlen(text))
    close(fd)
}

その他の実装、開発

Swift 2.2から、Ubuntuディストリビューション向けの公式ダウンロードが利用可能である。さらに、Swift 5.2.4からはCentOSAmazon Linux等の多くのディストリビューションが追加されている[26]

Swiftがオープンソース化されたことにより、他環境に移植されることが期待されている[27]Webフレームワークとしては、IBMによるKituraVapor等がすでに存在する。また、Appleによって公式の「Server APIs」ワークグループも開始されており、Swiftの開発メンバーが中心的な役割を担っている[28]

Androidで利用可能な非公式のツールチェーンも存在する[29]

2020年5月29日、AWS LambdaでSwiftを利用可能にする「Swift AWS Lambda Runtime」が公開された[30]

注釈

出典

  1. 出典URL: https://github.com/apple/swift/releases/tag/swift-5.8.1-RELEASE, 閲覧日: 2023年6月2日, 題名: Release 5.8.1, 出版日: 2023年6月1日
  2. Williams, Owen (2014年6月2日). Apple announces Swift, a new programming language for iOS”. The Next Web. 2014年6月2日閲覧。
  3. Protocol-oriented Programming in Swift. Apple Inc. YouTube.
  4. Introducing Swift”. Apple. 2014年6月2日閲覧。
  5. Chris Lattner's Homepage (2020年6月24日)
  6. Swift Has Reached 1.0 - Swift Blog - Apple Developer
  7. Swift Playgrounds、App Storeで提供開始
  8. Swift Playgrounds、さらに5か国語に対応
  9. Swift 3.1 Released! - swoft.org (2017年3月27日)
  10. [swift-evolution Update on the Swift Project Lead] - Chris Lattner (2017年1月10日)
  11. Swift 4.0 Released! - Ted Kremenek (2017年9月19日)
  12. 「Xcode」をMac App Storeで”. Mac App Store. 2018年4月2日閲覧。
  13. Xcode 10 includes Swift 4.2, which compiles your software more quickly, helps you deliver faster apps, and generates even smaller binaries. Xcode 10 (英語). Developer. 2018年6月12日閲覧。
  14. Swift.org - Swift 5 Released! (英語). 2020年3月18日閲覧。
  15. Introducing SwiftUI: Building Your First App - WWDC 2019 - Videos - Apple Developer (英語). 2020年3月23日閲覧。
  16. Swift.org - Swift 5.1 Released! (英語). 2020年11月2日閲覧。
  17. Swift.org - Swift 5.2 Released! (英語). 2020年11月25日閲覧。
  18. Swift.org - Swift 5.3 released! (英語). 2021年4月13日閲覧。
  19. Introducing Swift on Windows (英語). 2020年11月2日閲覧。
  20. Hudson, Paul (2021年6月6日). What's new in Swift 5.5?”. HackingWithSwift.com. Hacking with Swift. 2021年7月29日閲覧。
  21. Automatic Reference Counting — The Swift Programming Language (Swift 5.2) (英語). 2020年5月25日閲覧。
  22. Using Swift with Cocoa and Objective-C (HTML). Apple Inc.. 2014年9月2日閲覧。
  23. Importing Objective-C into Swift”. Apple Inc.. 2020年6月22日閲覧。
  24. Importing Swift into Objective-C”. Apple Inc.. 2020年6月22日閲覧。
  25. Migrating Your Objective-C Code to Swift”. Apple Inc.. 2020年6月22日閲覧。
  26. Swift.org - Download Swift”. 2020年11月2日閲覧。
  27. IBM brings Swift to the cloud, releases web framework Kitura written in Apple’s programming language”. 2020年3月23日閲覧。
  28. Inc., Apple. “Server APIs Work Group”. Swift.org. https://swift.org/blog/server-api-workgroup/ 2020年5月25日閲覧。
  29. Swift for Android: Our Experience and Tools”. 2021年3月24日閲覧。
  30. “Swift.org - Introducing Swift AWS Lambda Runtime”. https://swift.org/blog/aws-lambda-runtime/ 2020年9月24日閲覧。

外部リンク

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.