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

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

迅速
Swiftlogo.svg
ロゴ
パラダイムマルチパラダイムプロトコル指向オブジェクト指向機能的必須ブロック構造化宣言型並行
によって設計されたクリス・ラトナー、ダグ・グレゴール、ジョン・マッコール、テッド・クレメネク、ジョー・グロフ、アップル社[1]
デベロッパーAppleInc。とオープンソースの貢献者
初登場2014年6月2日; 7年前[2] (2014-06-02
安定リリース
5.5.2 [3] ウィキデータでこれを編集する / 2021年12月13日; 57日前 (2021年12月13日
プレビューリリース
5.6ブランチ[4]
規律の入力静的強い推測
OSAppleのオペレーティングシステム(DarwiniOSiPadOSmacOStvOSwatchOS)、LinuxWindows 10Android
ライセンスApache License 2.0(Swift 2.2以降)
独自仕様(Swift 2.2まで)[5] [6]
ファイル名拡張子.swift、.SWIFT
Webサイト
に影響を受けた
Objective-C[7] RustHaskellRubyPythonC#CLU[8] D [9]
影響を受け
さび[10]

Swiftは、AppleInc オープンソースコミュニティによって開発された汎用マルチパラダイムコンパイル 型プログラミング言語です。2014年に最初にリリースされたSwiftは、Appleの以前のプログラミング言語であるObjective-Cの代わりとして開発されました。これは、Objective-Cが1980年代初頭からほとんど変更されておらず、最新の言語機能が不足していたためです。SwiftはAppleのCocoaおよびCocoaTouchフレームワークで動作します 、そしてSwiftの設計の重要な側面は、過去数十年にわたってApple製品用に開発された既存のObjective-Cコードの膨大な本体と相互運用できることでした。オープンソースのLLVM コンパイラフレームワークで構築され、2014年にリリースされたバージョン6からXcodeに含まれています。Appleプラットフォームでは[11]CObjective-CC ++および1つのプログラム内で実行するSwiftコード。[12]

Appleは、SwiftがObjective-Cに関連する多くのコアコンセプト、特に動的ディスパッチ、広範な遅延バインディング拡張可能なプログラミング、および同様の機能をサポートすることを意図していましたが、「より安全な」方法で、ソフトウェアのバグを簡単に見つけられるようにしましたSwiftには、 nullポインターの逆参照など、いくつかの一般的なプログラミングエラーに対処する機能があり、運命のピラミッドを回避するのに役立つ構文糖衣構文を提供しますSwiftは、型、構造体クラスに適用できる拡張性システムであるプロトコル拡張性の概念をサポートしています。 、Appleがプログラミングパラダイムの真の変化として推進しているもので、彼らは「プロトコル指向プログラミング」[13]と呼んでいます(特性と同様)。[14]

Swiftは、Appleの2014 Worldwide Developers Conference(WWDC)で紹介されました。[15] 2014年にバージョン1.2にアップグレードされ、WWDC2015でSwift2にメジャーアップグレードされました。当初はプロプライエタリ言語であるバージョン2.2が、2015年12月3日にApache License2.0の下でAppleのプラットフォーム向けのオープンソースソフトウェアになりました。およびLinux[16] [17]

バージョン3.0では、Swiftの構文が大幅に進化し、コアチームがソースの安定性を後のバージョンで重視するようになりました。[18] [19] 2018年の第1四半期に、Swiftは測定された人気でObjective-Cを上回りました。[20]

2017年にリリースされたSwift4.0では、いくつかの組み込みクラスと構造にいくつかの変更が加えられました。以前のバージョンのSwiftで記述されたコードは、Xcodeに組み込まれている移行機能を使用して更新できます。2019年3月にリリースされたSwift5は、Appleプラットフォームに安定したバイナリインターフェイスを導入し、SwiftランタイムをAppleオペレーティングシステムに組み込むことができるようにしました。Swift4とソース互換です。[21]

Swift 5.1は2019年9月に正式にリリースされました。Swift5.1は、モジュールの安定性の導入により、言語の安定した機能をコンパイル時に拡張することにより、以前のバージョンのSwift5に基づいています。モジュールの安定性の導入により、Swiftの将来のリリースで機能するバイナリフレームワークを作成して共有できるようになります。[22]

Swift 5.5は、2021年のWWDCでAppleによって正式に発表され、並行性非同期コードの言語サポートを大幅に拡張し、特にアクターモデルの独自のバージョンを導入しています。[23]

歴史

Swiftの開発は、2010年7月にChris Lattnerによって開始され、最終的にはAppleの他の多くのプログラマーと協力しましたSwiftは、「 Objective-CRustHaskellRubyPythonC#CLUなど、リストに載せるにはあまりにも多くの言語のアイデアを取り入れました」。[8] 2014年6月2日、Apple Worldwide Developers Conference(WWDC)アプリケーションは、Swiftで作成された最初の公開アプリになりました。[ 24]プログラミング言語ベータ版はカンファレンスで登録済みのApple開発者にリリースされましたが、同社はSwiftの最終バージョンがテストバージョンと互換性のあるソースコードになるとは約束していませんでした。Appleは、フルリリースに必要な場合はソースコードコンバータを利用できるようにすることを計画しました。[24]

500ページの無料マニュアルであるSwiftProgramming LanguageもWWDCでリリースされており、Apple BooksStoreおよび公式Webサイトで入手できます。[25]

Swiftは、 iOS用Xcode 6.0のゴールドマスターで、2014年9月9日に1.0マイルストーンに到達しました[26] Swift 1.1は、Xcode 6.1のリリースとともに、2014年10月22日にリリースされました。[27] Swift 1.2は、Xcode6.3とともに2015年4月8日にリリースされました。[28] Swift2.0はWWDC2015で発表され、2015年9月21日にAppStoreでアプリを公開できるようになりました。[29] Swift3.0は2016年9月13日にリリースされました。[30] Swift4.0は9月にリリースされました。 2017年3月19日。[31] Swift4.1は2018年3月29日にリリースされました。[32]

SwiftはStack Overflow Developer Survey 2015 [33]で最も愛されているプログラミング言語で1位を獲得し、2016年に2位を獲得しました。[34]

2015年12月3日、Swift言語、サポートライブラリ、デバッガー、およびパッケージマネージャーがApache 2.0ライセンスの下でランタイムライブラリ例外[35]を使用してオープンソース化され、プロジェクトをホストするためにSwift.orgが作成されました。ソースコードはGitHubでホストされており、誰でも簡単にコードを取得してビルドし、プルリクエストを作成してコードをプロジェクトに戻すこともできます。

2015年12月、IBMはSwift Sandbox Webサイトを発表しました。これにより、開発者は1つのペインでSwiftコードを記述し、別のペインで出力を表示できます。[36] [37] [38] SwiftSandboxは2018年1月に非推奨になりました。[39]

WWDC 2016の期間中、AppleはSwiftPlaygroundsという名前のiPad専用アプリを発表しましたこれSwiftのコーディング方法を人々に教えることを目的としています。このアプリは、コードの行が特定の順序で配置されて実行されたときにフィードバックを提供する3Dビデオゲームのようなインターフェイスで表示されます。[40] [41] [42]

2017年1月、Chris Lattnerは、Appleを離れてTesla Motorsの新しい役職に就くことを発表しました。Swiftプロジェクトの主役は、チームのベテランであるTedKremenekになります。[43] [44]

WWDC 2019の間に、AppleはXcode 11を備えたSwiftUIを発表しました。これは、すべてのAppleプラットフォームにわたる宣言型UI構造設計のフレームワークを提供します。[45]

LinuxのUbuntuディストリビューションの公式ダウンロードは、Swift 2.2以降で利用可能であり、Swift 5.2.4、CentOS、およびAmazonLinux以降にさらに多くのディストリビューションが追加されています。[46] Android用の非公式のSDKとネイティブツールチェーンパッケージもあります。[47] [48]

プラットフォーム

Swiftがサポートするプラットフォームは、Appleのオペレーティングシステム(DarwiniOSiPadOSmacOStvOSwatchOS)、LinuxWindows、およびAndroidです。[49] [50]

バージョン履歴

バージョン 発売日 マックOS Linux ウィンドウズ
スイフト1.0 2014年9月9日 はい 番号 番号
Swift 1.1 2014年10月22日 はい 番号 番号
スイフト1.2 2015年4月8日 はい 番号 番号
Swift 2.0 2015年9月21日 はい 番号 番号
Swift 2.1 2015年10月20日 はい 番号 番号
スイフト2.2 2016年3月21日 はい はい 番号
スイフト2.2.1 2016年5月3日 はい はい 番号
Swift 3.0 2016年9月13日 はい はい 番号
Swift 3.0.1 2016年10月28日 はい はい 番号
Swift 3.0.2 2016年12月13日 はい はい 番号
Swift 3.1 2017年3月27日 はい はい 番号
Swift 3.1.1 2017年4月21日 はい はい 番号
Swift 4.0 2017年9月19日 はい はい 番号
Swift 4.0.2 2017年11月1日 はい はい 番号
Swift 4.0.3 2017年12月5日 はい はい 番号
Swift 4.1 2018年3月29日 はい はい 番号
スウィフト4.1.1 2018年5月4日 番号 はい 番号
スウィフト4.1.2 2018年5月31日 はい はい 番号
Swift 4.1.3 2018年7月27日 番号 はい 番号
Swift 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日 番号 はい 番号
Swift 5.0 [51] 2019年3月25日 はい はい 番号
Swift 5.0.1 2019年4月18日 はい はい 番号
Swift 5.0.2 2019年7月15日 番号 はい 番号
Swift 5.0.3 2019年8月30日 番号 はい 番号
Swift 5.1 2019年9月10日 はい はい 番号
Swift 5.1.1 2019年10月11日 番号 はい 番号
Swift 5.1.2 2019年11月7日 はい はい 番号
Swift 5.1.3 2019年12月13日 はい はい 番号
Swift 5.1.4 2020年1月31日 番号 はい 番号
Swift 5.1.5 2020年3月9日 番号 はい 番号
Swift 5.2 2020年3月24日 はい はい 番号
Swift 5.2.1 2020年3月30日 番号 はい 番号
Swift 5.2.2 2020年4月15日 はい はい 番号
Swift 5.2.3 2020年4月29日 番号 はい 番号
Swift 5.2.4 2020年5月20日 はい はい 番号
Swift 5.2.5 2020年8月5日 番号 はい 番号
Swift 5.3 2020年9月16日 はい はい はい[52]
Swift 5.3.1 2020年11月13日 はい はい はい
Swift 5.3.2 2020年12月15日 はい はい はい
Swift 5.3.3 2021年1月25日 番号 はい はい
Swift 5.4 [53] 2021年4月26日 はい はい はい
Swift 5.4.1 2021年5月25日 番号 はい はい
Swift 5.4.2 2021年6月28日 はい はい はい
Swift 5.4.3 2021年9月9日 番号 はい はい
Swift 5.5 2021年9月20日 はい はい はい
Swift 5.5.1 2021年10月27日 はい はい はい
Swift 5.5.2 2021年12月14日 はい はい はい

機能

Swiftは、最新のプログラミング言語理論の概念を採用し、より単純な構文の提示に努めるObjective-C言語の代替手段です。導入時には、単に「Cの手荷物のないObjective-C」と表現されていました。[54] [55]

デフォルトでは、オブジェクトインスタンスを参照するためにポインタを広く使用するObjective-Cとは対照的に、Swiftはポインタやその他の安全でない アクセサを公​​開しません。また、Objective-Cがメソッド呼び出しを行うためにSmalltalkのような構文を使用することは、 JavaC#などの他の一般的なオブジェクト指向(OO)言語のプログラマーにとってより馴染みのあるドット表記スタイルと名前空間システムに置き換えられました。Swiftは、真の名前付きパラメーターを導入し、プロトコルクロージャーカテゴリーなど、Objective-Cの主要な概念を保持しています。、多くの場合、以前の構文をよりクリーンなバージョンに置き換え、これらの概念を列挙型(列挙型)などの他の言語構造に適用できるようにします。[56]

閉鎖サポート

Swiftはクロージャ他の言語ではラムダとして知られています) [説明が必要]をサポートしています。クロージャーは、コード内で受け渡して使用できる機能の自己完結型のブロックです。[57]クロージャーは、名前のない関数と考えることができます。次に例を示します。

//入力値と出力値で定義されるクロージャタイプは、クロージャの外部で指定できます。
letclosure1   Int Int - > Int = { arg1 arg2 in        
     arg1  +  arg2を返します
}

//…またはその中:
letclosure2  =  {   arg1 Int arg2 Int - > Int in      
     arg1  +  arg2を返します
}

//ほとんどの場合、クロージャの戻り型はコンパイラによって自動的に推測されます。
//ただし、この機能は複雑すぎる式では機能しない場合があります。
letclosure3  = { arg1 Int arg2 Int in _       
     arg1  +  arg2を返します
}

Swiftには、次のような末尾のクロージャ構文があります。

//この関数は、入力パラメータを受け取らず、整数を返すクロージャを取ります。
//それを評価し、クロージャの戻り値(Int)を関数の戻り値として使用します。
func  foo クロージャー バー () ->  Int  ->  Int  {
    リターン バー()
}

//末尾のクロージャ構文なし:
foo クロージャー {  return  1  })

//末尾のクロージャ構文を使用:
foo  {  return  1  }

バージョン5.3以降、Swiftは複数の末尾のクロージャをサポートしています。[58]

//この関数は、最初のクロージャの戻り値を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  }

末尾のクロージャ構文の基準は次のとおりです。

  • 関数の最後の引数がクロージャである場合は、末尾のクロージャ構文を使用できます。
  • 最初の末尾のクロージャのパラメータ名は省略できます。
  • 残りの末尾のクロージャのパラメータ名は省略しないでください。
  • 関数に指定されたすべての引数が末尾のクロージャである場合は、関数名の後の括弧を省略できます。
  • guardステートメントで使用する場合は、末尾にクロージャがある関数の呼び出しを括弧で囲む必要があります。[59]

文字列のサポート

CocoaおよびCocoaTouch環境では、多くの一般的なクラスがFoundationKitライブラリの一部でした。これには、NSString文字列ライブラリ(UnicodeSwift 5のUTF-8を使用、 UTF-16から変更)、NSArrayおよびNSDictionaryコレクションクラスなどが含まれていました。Objective-Cは、これらのオブジェクトの一部を言語内でオンザフライで作成できるようにするために、さまざまな構文糖衣構文を提供しましたが、作成されると、オブジェクトはオブジェクト呼び出しで操作されました。たとえば、Objective-Cで2つのNSStringを連結するには、次のようなメソッド呼び出しが必要です。

NSString * str = @ "hello、" ;   
str = [ str stringByAppendingString @ "world" ];   

Swiftでは、これらの基本的なタイプの多くが言語のコアに昇格しており、直接操作できます。たとえば、文字列は(Foundationがインポートされるときに)NSStringに目に見えない形でブリッジされ、+演算子と連結できるようになり、構文が大幅に簡素化されます。前の例は次のようになります:[60]

var  str  =  "hello、" 
str  + =  "world"

アクセス制御

Swiftは、シンボルの5つのアクセス制御レベル(、、、、、、およびサポートしています多くのオブジェクト指向言語とは異なり、これらのアクセス制御は継承階層を無視します。シンボルが直接のスコープのみアクセス可能であること、ファイル内からのみアクセス可能であること、包含モジュール内でアクセス可能であること、からアクセス可能であることを示します。任意のモジュール、および(クラスとそのメソッドのみ)は、クラスがモジュールの外部でサブクラス化される可能性があることを示します。[61]openpublicinternalfileprivateprivateprivatefileprivateinternalpublicopen

オプションと連鎖

Swiftの重要な新機能は、オプションタイプです。これにより、参照または値をCの一般的なパターンと同様の方法で操作できます。この場合ポインターは値を参照するか、nullになる可能性があります。これは、オプション以外の型ではnullポインターエラーが発生しないことを意味します。コンパイラは、これが不可能であることを確認できます。

オプション型はOptionalメカニズムを使用して作成されます。null許容の整数を作成するには、。のような宣言を使用しvar optionalInteger: Optional<Int>ます。C#と同様に、[62] Swiftにはこのための構文糖衣も含まれており、型名の後に疑問符を付けることで変数がオプションであることを示すことができますvar optionalInteger: Int?[63]オプションとしてマークされている変数または定数は、基になる型の値を持っているか、ですnilオプション型は基本型をラップするため、インスタンスが異なります。StringString?は根本的に異なるタイプであり、後者はよりも共通点がInt?ありStringます。

内部の値にアクセスするには、nilでない場合、内部のインスタンスを公開するためにラップを解除する必要があります。これは、次の!演算子 を使用して実行されます。

 myValue  =  anOptionalInstance とします。someMethod ()

この場合、!演算子はラップを解除anOptionalInstanceして内部のインスタンスを公開し、メソッド呼び出しを実行できるようにします。がnilの場合anOptionalInstance、nullポインタエラーが発生します。これは実際には煩わしい場合があるため、Swiftには、インスタンスがnilであるかどうかをテストし、nullでない場合はアンラップする、 オプションのチェーンの概念も含まれています。

 myValue  =  anOptionalInstance _ someMethod ()

この場合、ランタイムはがnilでないsomeMethod場合にのみ呼び出しanOptionalInstance、エラーを抑制します。通常、これには、myValue続行する前にプログラマーがnilかどうかをテストする必要があります。チェーンという用語の由来は、複数のメソッド呼び出し/ゲッターが一緒にチェーンされる、より一般的なケースに由来します。例えば:

aTenant  = aBuilding としますTenantList [ 5 ] let theirLease = aTenant LeaseDetailsleaseStart = theirLease ?を許可します。開始日 
   
   

次のように減らすことができます:

 リーススタート= aBuilding  ますテナントリスト[ 5 ]。リースの詳細開始日

構文は、運命のピラミッドを?回避します

guardSwift 2では、条件が満たされていない場合にコードの実行を停止する必要がある場合に 、新しいキーワードが導入されました。

ガード レット leaseStart  =  aBuilding TenantList [ 5 ] ?。リースの詳細startDate  else 
{ 
    //チェーン内のすべてがnilであるエラーケースを処理します
    // elseスコープは現在のメソッドまたはループを終了する必要があります
} 
//続行します。leaseStartがnilではないことを認識します

使用guardには3つの利点があります。構文はifステートメントとして機能できますが、その主な利点は、null可能性がないと推測できることです。ifステートメントでケースが必要な場合guard、提供された条件に基づいてケースを想定します。また、クロージャーguardを除いてスコープが含まれていないため、ガードのスーパースコープのラップされていないオプションとして表示されます。最後に、ステートメントのテストが失敗した場合、Swiftは現在のメソッドまたはループを終了するように要求しますこれは、キーワード、、、、、またはを使用してまたは(eg )を返す関数を呼び出すことによって実行されます。 elseleaseStartguardelseleaseStartnilreturncontinuebreakthrowNeverfatalError()

Objective-Cは弱い型付けであり、いつでも任意のオブジェクトで任意のメソッドを呼び出すことができました。メソッド呼び出しが失敗した場合、nilを返すデフォルトのハンドラーがランタイムにありました。つまり、アンラッピングやテストは必要ありませんでした。Objective-Cの同等のステートメントです。

LeaseStart = [[[ aBuilding TenantList 5 ] LeaseDetails ] startDate ]     

nilを返し、これをテストできます。ただし、これにはすべてのメソッド呼び出しが動的である必要もあり、これによりかなりのオーバーヘッドが発生します。Swiftのオプションの使用は、nilsをテストおよび処理するための同様のメカニズムを提供しますが、アンラップアクションが定義されたインスタンス(ラッパー)で呼び出されるため、ランタイムディスパッチで発生するのではなく、コンパイラが静的ディスパッチを使用できるようにします。システム。

値型

多くのオブジェクト指向言語では、オブジェクトは内部的に2つの部分で表されます。オブジェクトはヒープに配置されたデータのブロックとして格納され、そのオブジェクトの名前(または「ハンドル」)はポインタで表されますオブジェクトは、ポインターの値をコピーすることによってメソッド間で渡され、ヒープ上の同じ基になるデータに、コピーを持っている人なら誰でもアクセスできるようにします。対照的に、整数や浮動小数点値などの基本的な型は直接表されます。ハンドルにはデータへのポインタではなくデータが含まれており、そのデータはコピーによってメソッドに直接渡されます。これらのアクセススタイルは、オブジェクトの場合は参照渡し、基本タイプ の場合は値渡しと呼ばれます。

どちらの概念にも長所と短所があります。オブジェクトは、ウィンドウの説明やドキュメントのコンテンツなど、データが大きい場合に役立ちます。このような場合、そのデータへのアクセスは、データ構造全体をコピーするのではなく、32ビットまたは64ビットの値をコピーすることによって提供されます。ただし、整数などの小さい値はポインターと同じサイズであるため(通常は両方とも1ワードです)、値を渡すよりもポインターを渡す方が有利ではありません。また、参照渡しには本質的に逆参照操作が必要です。これにより、一部の操作、通常は数学などのこれらの基本的な値型で使用される操作で、顕著なオーバーヘッドが発生する可能性があります。

C#と同様に、他のほとんどのオブジェクト指向言語とは対照的に、[要出典] Swiftは、参照渡しまたは値渡しのいずれかのセマンティクスを使用するオブジェクトの組み込みサポートを提供します。前者はclass宣言を使用し、後者はを使用しstructます。Swiftの構造体には、クラスとほぼ同じ機能があります。メソッド、プロトコルの実装、拡張メカニズムの使用です。このため、Appleはすべてのデータを、オブジェクトや値ではなく、一般的にインスタンスと呼んでいます。ただし、構造体は継承をサポートしていません。[64]

プログラマーは、アプリケーションの各データ構造に適したセマンティクスを自由に選択できます。ウィンドウのような大きな構造はクラスとして定義され、ポインターとして渡すことができます。2Dポイントのような小さな構造体は、構造体として定義できます。構造体は値渡しであり、間接参照なしで内部データに直接アクセスできます。値渡しの概念に固有のパフォーマンスの向上により、Swiftは、およびを含むほとんどすべての一般的なデータ型、および通常はオブジェクトなどで表される型にこれらの型をInt使用Doubleます[64]値型を使用すると、ユーザーアプリケーションのパフォーマンスも大幅に向上する可能性があります。[65]StringArray

最大の構造体でさえ、それらが渡されたときにパフォーマンスの低下を引き起こさないようにするために、Swiftはコピーオンライトを使用して、プログラムがオブジェクトの値を変更しようとした場合にのみオブジェクトがコピーされるようにします。これは、さまざまなアクセサが、実際には同じデータストレージへのポインタを持っていることを意味します。したがって、データは1つのインスタンスとしてメモリに物理的に保存されますが、アプリケーションのレベルでは、これらの値は分離されており、物理的な分離は、必要な場合にのみコピーオンライトによって適用されます。[66]

プロトコル指向プログラミング

Objective-Cの重要な機能は、実行時にクラスを拡張するために追加できるカテゴリ、メソッドのサポートです。カテゴリを使用すると、クラスをインプレースで拡張して、サブクラスを作成したり、元のソースコードにアクセスしたりすることなく、新しい関数を追加できます例として、基本クラスにスペルチェッカーのサポートを追加する場合がNSStringあります。これは、アプリケーション内のNSStringのすべてのインスタンスがスペルチェックを取得することを意味します。このシステムは、組織的な手法としても広く使用されており、関連するコードをライブラリのような拡張機能に集めることができます。Swiftはこの概念を引き続きサポートしますが、現在は拡張機能と呼ばれ、キーワードで宣言されています。extensionObjective-Cとは異なり、Swiftは新しいプロパティのアクセサー、タイプ、列挙型を既存のインスタンスに追加することもできます[要出典]

Objective-Cのもう1つの重要な機能は、最新の言語ではインターフェイスとして知られているプロトコルの使用です。プロトコルは、特定のクラスが一連のメソッドを実装することを約束します。つまり、システム内の他のオブジェクトは、そのプロトコルをサポートする任意のオブジェクトでそれらのメソッドを呼び出すことができます。機能セットは完全に類似しているわけではありませんが、これは多重継承の代わりとして現代のオブジェクト指向言語でよく使用されます。Cocoaのプロトコルの一般的な例は、オブジェクトのディープコピーを実装する1つのメソッドを定義するプロトコルです。[67]NSCopyingcopyWithZone

Objective-C、およびプロトコルの概念を実装する他のほとんどの言語では、必要なメソッドが各クラスに実装されていることを確認するのはプログラマーの責任です。[68] Swiftは、拡張機能を使用してこれらのメソッドを追加し、ジェネリックプログラミング(ジェネリック)を使用してそれらを実装する機能を追加します。これらを組み合わせると、プロトコルを1回作成するだけで、さまざまなインスタンスをサポートできます。また、拡張メカニズムを使用して、定義にそのプロトコルがリストされていないオブジェクトにプロトコル適合性を追加できます。[67]

たとえば、プロトコルがと呼ばれるように宣言されStringConvertibleている場合があります。これにより、プロトコルに準拠するインスタンスが、toStringを返すメソッドを実装することが保証されますStringSwiftでは、これは次のようなコードで宣言できます。

プロトコル StringConvertible 
{ 
    func  toString () -> 文字列
}

このプロトコルは、基本クラスのソースにアクセスすることなく、Stringに追加できるようになりました。

拡張 文字列 StringConvertible 
{ 
    func  toString () ->  String 
    { 
        self 
    } 
}

Swiftでは、インターフェースをサポートする多くの現代言語と同様に、プロトコルを型として使用できます。つまり、変数とメソッドは、特定の型ではなくプロトコルで定義できます。

var  someSortOfPrintableObject  StringConvertible 
... 
print someSortOfPrintableObject。toString 

インスタンスの種類は関係ありませんsomeSortOfPrintableObject。コンパイラは、インスタンスがプロトコルに準拠していることを確認するため、このコードは安全です。この構文は、コレクションがのようなプロトコルにも基づくことができることも意味しますlet printableArray = [StringConvertible]

Swiftは構造体とクラスを同様の概念として扱うため、拡張機能とプロトコルの両方がSwiftのランタイムで広く使用され、構造体に基づく豊富なAPIを提供します。たとえば、Swiftは拡張機能を使用して、文字列や配列などの基本的な型の多くにプロトコルを追加し、演算子Equatableと比較できるようにします。これらすべての機能がどのように相互作用するかの具体的な例は、デフォルトのプロトコル実装==の概念で見ることができます

func  != < T   同等>(lhs  T  rhs  T  -> ブール

この関数は、に準拠する任意のインスタンスで機能するメソッドを定義し、等しくないEquatable関数を提供します。すべてのインスタンス、クラス、または構造体は、に準拠するだけでこの実装を自動的に取得します。多くのインスタンスは、基本実装または他の一般的な拡張機能を介してゲインを取得するため、ランタイムゲインのほとんどの基本オブジェクトは、コードがない場合と同等であり、同等ではありません。[69]EquatableEquatable

プロトコル、デフォルト、プロトコル継承、および拡張のこの組み合わせにより、通常はクラスと継承に関連付けられている関数の多くを値型に実装できます。[67]適切に使用すると、APIに大きな制限がなく、劇的なパフォーマンスの向上につながる可能性があります。この概念はSwift内で非常に広く使用されているため、Appleはこれをプロトコル指向プログラミング言語と呼び始めています彼らは、代わりにプロトコルと構造体を使用して、クラスと継承によって通常解決される問題ドメインの多くに対処することを提案しています。

ライブラリ、ランタイム、開発

Appleシステムでは、Swiftは既存のObjective-Cシステムと同じランタイムを使用しますが、iOS7またはmacOS10.9以降が必要です。グランドセントラルディスパッチにも依存します。[70] SwiftおよびObjective-Cコードは、1つのプログラムで使用でき、さらに、CおよびC ++も使用できます。Cとは対照的に、C ++コードをSwiftから直接使用することはできません。Objective-CまたはCラッパーは、SwiftとC ++の間に作成する必要があります。[71] Objective-Cの場合、Swiftはオブジェクトモデルにかなりアクセスでき、Objective-Cコードをサブクラス化、拡張、および使用してプロトコルサポートを提供できます。[72]その逆は真実ではありません。SwiftクラスをObjective-Cでサブクラス化することはできません。[73]

このようなプログラムの開発と既存のコードの再利用を支援するために、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からシンボルにアクセスできなくなる可能性があります。[74]

Swiftは、開発環境によって読み取られる属性、メタデータのサポートも制限されており、必ずしもコンパイルされたコードの一部ではありません。Objective-Cと同様に、属性は@構文を使用しますが、現在使用可能なセットは小さいです。1つの例は、Interface Builder(IB)内で使用できる@IBOutlet、コード内の特定の値をアウトレットとしてマークする属性です。コンセントは、オンスクリーンディスプレイの値をコード内のオブジェクトにバインドするデバイスです

Apple以外のシステムでは、SwiftはObjective-Cランタイムやその他のAppleシステムライブラリに依存しません。Swiftの「Corelib」実装のセットがそれらを置き換えます。これらには、Foundation Kitの代わりとなる「swift-corelibs-foundation」、Grand Central Dispatchの代わりとなる「swift-corelibs-libdispatch」、XCTestの代わりとなる「swift-corelibs-xctest」が含まれます。XcodeのAPI [75]

2019年の時点で、Xcode 11で、AppleはSwiftUIと呼ばれる主要な新しいUIパラダイムも追加しました。SwiftUIは、古いInterfaceBuilderパラダイムを新しい宣言型開発パラダイムに置き換えます。[76]

メモリ管理

Swiftは、自動参照カウント(ARC)を使用してメモリを管理しますAppleはObjective-Cで手動のメモリ管理を要求していましたが、メモリの割り当てと割り当て解除を容易にするために2011年にARCを導入しました。[77] ARCの問題の1つは、強力な参照サイクルを作成する可能性です。この場合、参照をたどることで開始したオブジェクトに到達できるように、オブジェクトが相互に参照します(たとえば、A参照B、B参照A)。これにより、解放されないため、メモリにリークされます。Swiftはキーワードweakを提供し、unowned強力な参照サイクルを防ぎます。通常、親子関係は強力な参照を使用しますが、子親はいずれかを使用しますweak参照。親と子が無関係である可能性がある場合、またはunowned子には常に親があるが、親には子がない場合があります。弱参照は変更されて。になる可能性があるため、オプション変数である必要がありますnil[78]

クラス内のクロージャは、自己参照をキャプチャすることにより、強力な参照サイクルを作成することもできます。弱いまたは所有されていないものとして扱われる自己参照は、キャプチャリストを使用して示すことができます。

デバッグおよびその他の要素

Swiftシステムの重要な要素は、 read-eval-print loop (REPL)を使用して、開発環境内でクリーンにデバッグおよび実行できることです。これにより、従来のシステムプログラミングよりもPythonのスクリプト機能と共通するインタラクティブなプロパティが提供されます。言語。REPLは、プレイグラウンド、コードまたはデバッガーの変更にオンザフライで応答するXcode環境内で実行されるインタラクティブビューによってさらに強化されます。[79]プレイグラウンドを使用すると、プログラマーはマークダウンドキュメントとともにSwiftコードを追加できます。一部のコードが時間の経過とともに、または他の範囲入力値に関して変更された場合、ビューをタイムラインアシスタントで使用して、アニメーション化された方法で出力を示すことができます。さらに、Xcodeには、ブレークポイント、ステップスルーおよびステップオーバーステートメント、アプリ開発者向けのUI要素配置の内訳など、Swift開発用のデバッグ機能があります。

Appleによれば、Swiftは「スクリプト言語と同じくらい表現力があり楽しい産業品質のプログラミング言語」です。[80]

パフォーマンス

Swiftで導入された機能の多くには、パフォーマンスと安全性のトレードオフがよく知られています。Appleは、このオーバーヘッドを削減する最適化を実装しました。[81]

他の言語との比較

SwiftはCファミリーのプログラミング言語と見なされており、さまざまな点でCに似ています。

  • ほとんどのC演算子はSwiftで使用されますが、たとえばオーバーフローを伴う整数演算をサポートするために、いくつかの新しい演算子があります(相違点を参照)。
  • 中括弧は、ステートメントをグループ化するために使用されます。
  • 変数は等号を使用して割り当てられますが、2つの連続する等号使用して比較されます。2つのデータ要素が同じオブジェクトを参照しているかどうかを確認するために、新しいID演算子===が提供されています
  • 制御ステートメント、、、whileおよびifswitch類似していますが、拡張機能があります。たとえば、switch整数以外の場合を取り、パターンマッチングwhileifサポートし、オプションを条件付きでアンラップするaは、構文を使用します。forfor i in 1...10
  • 角かっこは配列で使用され、配列を宣言し、そのうちの1つで特定のインデックスの値を取得します。

また、Objective-Cとの類似点もあります。

  • 基本的な数値型(Int, UInt, Float, Double
  • クラスメソッドは、インスタンスメソッドと同様に継承されます。selfクラスメソッドでは、メソッドが呼び出されたクラスです。
  • 同様のfor...in列挙構文。

Objective-Cとの違いは次のとおりです。

  • ステートメントはセミコロン(;)で終わる必要はありませんが、1行に複数のステートメントを許可するために使用する必要があります。
  • ヘッダーファイルはありません。
  • 型推論を使用します。
  • ジェネリックプログラミング
  • 関数はファーストクラスのオブジェクトです。
  • 列挙型のケースには、関連するデータ(代数的データ型)を含めることができます。
  • 演算子はクラスに対して再定義でき(演算子のオーバーロード)、新しい演算子を定義できます。
  • 文字列はUnicodeを完全にサポートしていますほとんどのUnicode文字は、識別子または演算子のいずれかで使用できます。
  • 例外処理はありませんSwift 2では、互換性のない別のエラー処理モデルが導入されています。[82]
  • 誤用しやすい 以前のCファミリ言語のいくつかの機能が削除されました。
    • デフォルトでは、ポインタは公開されていません。プログラマーが参照または逆参照のために名前を追跡してマークする必要はありません。
    • 割り当ては値を返しません。これにより、コンパイル時エラーをスローするi = 0代わりに、書き込みの一般的なエラーを防ぐことができます。i == 0
    • ブロックbreak内のステートメントを使用する必要はありません。ステートメントが使用されswitchない限り、個々のケースは次のケースに分類されません。fallthrough
    • 変数と定数は常に初期化され、配列の境界は常にチェックされます。
    • 整数のオーバーフローは、Cの符号付き整数の未定義動作を引き起こし、Swiftの実行時エラーとしてトラップされます。プログラマーは、特別な算術演算子、、、、およびを使用してオーバーフローを許可することを&+選択できますプロパティはすべての整数型に対してSwiftで定義されており、外部ライブラリの各型に定義された定数に依存するのではなく、潜在的なオーバーフローを安全にチェックするために使用できます。&-&*&/&%minmax
    • ifステートメントの前後の中括弧を省略できるandの1ステートメント形式whileはサポートされていません。
    • オフバイワンエラーfor (int i = 0; i < c; i++)が発生しやすいCスタイルの列挙は、サポートされていません(Swift 3以降)。[83]
    • 前後のインクリメントおよびデクリメント演算子i++--i...)はサポートされていません(Swift 3以降)。CスタイルのforステートメントもSwift3以降ではサポートされていないためです。[84]

開発およびその他の実装

この言語はオープンソースであるため、Webに移植される可能性があります。[85] IBMKituraPerfectVaporなど、いくつかのWebフレームワークはすでに開発されています

公式の「サーバーAPI」ワークグループもAppleによって開始され[86]、Swift開発者コミュニティのメンバーが中心的な役割を果たしています。[87]

CocoaMicrosoft共通言語インフラストラクチャ.NET)、およびJavaおよびAndroidプラットフォームを対象とするSwiftの2番目の無料実装はRemObjectsSoftwareのElementsCompilerの一部として存在します。[88]

LLVMとMacintoshProgrammer's Workshopのツールチェーンを組み合わせることで、 Mac OS9で言語の非常に小さなサブセットを実行することができます。[89]

も参照してください

参考文献

  1. ^ 米国特許番号 9329844
  2. ^ 「スイフトは1.0に達しました」アップル。2014年9月9日2015年3月8日取得
  3. ^ https://github.com/apple/swift/releases
  4. ^ 「Swift5.6リリースプロセス」2021年11月。
  5. ^ 「迅速、客観的に」Swiftは独自仕様であり、クローズドです。Appleによって完全に制御されており、オープンソースの実装はありません。
  6. ^ ラトナー、クリス(2014年6月11日)。「Re:[LLVMdev] [cfe-dev] [Advertisement]アップルのSwiftコンパイラチームの募集職種」2014年7月14日にオリジナルからアーカイブされました2014年6月12日取得私たちの多くがオープンソースでLLVMの一部であることを望んでいることを想像できますが、議論はまだ行われておらず、しばらくは行われないでしょう。
  7. ^ ラトナー、クリス(2014年6月3日)。「クリス・ラトナーのホームページ」クリス・ラトナー2014年6月3日取得Swift言語は、言語の専門家、ドキュメンテーションの達人、コンパイラ最適化の忍者、そしてアイデアの洗練とバトルテストに役立つフィードバックを提供した非常に重要な社内ドッグフーディンググループのチームによるたゆまぬ努力の産物です。もちろん、Objective-C、Rust、Haskell、Ruby、Python、C#、CLUなど、他の多くの言語からアイデアを引き出して、この分野で苦労して獲得した経験からも大きな恩恵を受けました。
  8. ^ a b Lattner、Chris(2014年6月3日)。「クリス・ラトナーのホームページ」クリス・ラトナー2014年6月3日取得私は2010年7月にSwiftプログラミング言語の作業を開始しました。基本的な言語構造の多くを実装しましたが、その存在を知っている人はごくわずかでした。他の数人の(驚くべき)人々が2011年後半に本格的に貢献し始め、2013年7月にApple DeveloperToolsグループの主要な焦点となりました[...] Objective-C、Rust、Haskell、Ruby、Python、 C#、CLU、およびその他のリストには多すぎます。
  9. ^ 「Swiftでのassert()の構築、パート2:__ FILE__および__LINE__」2014年9月25日取得
  10. ^ 「影響-錆の参照」doc.rust-lang.org 2020年5月2日取得
  11. ^ 「SwiftLinuxポート」Swift.orgApple Inc. 2015年12月3日2016年8月3日取得
  12. ^ ティマー、ジョン(2014年6月5日)。「Appleの新しいプログラミング言語であるSwiftの概要」ArsTechnicaコンデナスト2014年6月6日取得
  13. ^ Swiftでのプロトコル指向プログラミングAppleIncYouTube
  14. ^ 「概念はRust特性に似ています」
  15. ^ ウィリアムズ、オーウェン(2014年6月2日)。「ティムバーナーズリーの60歳の誕生日Appleは、iOS用の新しいプログラミング言語であるSwiftを発表しました」次のWeb 2014年6月2日取得
  16. ^ 「Appleの新しいプログラミング言語Swiftがオープンソースになりました」ザ・ヴァージ2015年12月3日2015年12月5日取得
  17. ^ 「エンタープライズへの最新のピッチでのアップルオープンソーススイフト」CIOジャーナル。ウォールストリートジャーナルのブログ2015年12月3日2015年12月5日取得
  18. ^ 「Swift3を振り返り、Swift4を先に」Swiftフォーラム2016年7月29日2018年11月19日取得
  19. ^ 「Swift-Evolution」スウィフトエボリューション2018年11月19日取得
  20. ^ 「RedMonkプログラミング言語ランキング:2018年1月–tecosystems」redmonk.com2018年3月7日2018年11月20日取得
  21. ^ Kremenek、テッド(2019年3月25日)。「Swift5がリリースされました!」
  22. ^ Kremenek、テッド(2019年9月20日)。「Swift5.1がリリースされました!」
  23. ^ ハドソン、ポール(2021年6月6日)。「Swift5.5の新機能」HackingWithSwift.comSwiftによるハッキング2021年6月8日取得
  24. ^ a b プラットフォームの一般教書演説、セッション102、Apple Worldwide Developers Conference、2014年6月2日
  25. ^ Swiftプログラミング言語アップル2014年6月2日2014年6月2日取得要約を置く。 {{cite book}}Citeは非推奨のパラメーターを使用します|lay-url=help
  26. ^ 「スイフトは1.0に達しました」2014年9月9日2014年9月10日取得
  27. ^ 「Xcode6.1リリースノート」2014年10月22日2015年1月23日取得
  28. ^ 「Xcode6.3リリースノート」2015年4月8日2015年4月8日取得
  29. ^ 「AppStoreのSwift2アプリ」Swiftブログ2016年3月13日取得
  30. ^ 「Swift3.0がリリースされました!」Swift.org2016年9月13日2016年10月26日取得
  31. ^ 「Swift4.0がリリースされました!」Swift.org2017年9月17日2018年3月1日取得
  32. ^ 「Swift4.1がリリースされました!」Swift.org2018年3月29日2018年3月30日取得
  33. ^ 「StackOverflowDeveloper Survey Results2015」
  34. ^ 「StackOverflowDeveloper Survey Results2016」
  35. ^ 「Swift.orgとオープンソース」Swift.orgAppleInc 2019年2月25日取得
  36. ^ 「IBMSwiftサンドボックスの紹介—Swift」スイフト2015年12月5日取得
  37. ^ メイヨー、ベンジャミン(2015年12月4日)。「IBMSwiftサンドボックスを使用してWebブラウザーでSwiftコードを記述します」9to5Mac 2015年12月5日取得
  38. ^ 「Appleがそれをオープンソース化した後、IBMはSwiftプログラミングをクラウドに配置します| ZDNet」ZDNet 2015年12月5日取得
  39. ^ 「SwiftパッケージカタログとSwiftサンドボックスの非推奨」2018年11月9日取得
  40. ^ 「スウィフトプレイグラウンド」AppleDeveloper 2016年6月19日取得
  41. ^ 「SwiftPlaygrounds—プレビュー」アップル2016年6月19日取得
  42. ^ メイヨー、ベンジャミン(2016年6月13日)。「AppleはWWDCでiPad用のSwiftPlaygroundsを発表し、秋に公開されます」9to5Mac 2016年6月19日取得
  43. ^ カニンガム、アンドリュー(2017年1月10日)。「長年のAppleプログラマーとSwiftクリエーターはAppleをTeslaに任せます」ArsTechnica。
  44. ^ Wuerthele、Mike(2017年1月13日)。「新しいSwiftプロジェクトの責任者であるTedKremenekは、しばらくの間、舞台裏でショーを運営していると言われています」AppleInsider。
  45. ^ 水曜日、ダニエルエランディルガー; 6月19日; 2019; PT、午前11時26分。「WWDC19:SwiftUIは、新しいアイデアの銀河系の中で最も明るい星でした」AppleInsider 2019年7月19日取得{{cite web}}:CS1 maint:数値名:著者リスト(リンク
  46. ^ "Swift.org-Swiftをダウンロード" 2020年6月21日取得
  47. ^ 「Swift用のAndroidSDK」GitHub2021年9月10日取得
  48. ^ 「swift-langパッケージバージョン」2021年9月10日取得
  49. ^ Readdle(2020年1月15日)。「SwiftforAndroid:私たちの経験とツール」ミディアム2020年8月20日取得
  50. ^ アンダーソン、ティム(2020年3月30日)。「5.3で約束された公式に調整されたSwiftfor Windowsサポート:より多くのプラットフォームでのSwift –GUIが必要ない場合」レジスター2020年9月18日取得
  51. ^ Kremenek、テッド(2019年3月25日)。「Swift5がリリースされました!」Swift.org 2019年3月28日取得
  52. ^ 「Swiftをダウンロード」Swift.orgアップル2020年12月15日取得
  53. ^ Kremenek、テッド(2021年4月26日)。「Swift5.4がリリースされました!」Swift.orgアップル2021年4月26日取得
  54. ^ メッツ、レイチェル(2014年6月3日)。「Appleはより多くの開発者を誘惑するための迅速な方法を模索している」テクノロジーレビュー
  55. ^ ウェーバー、ハリソン(2014年6月2日)。「Appleは、macOSとiOS向けの新しいプログラミング言語である「Swift」を発表しました」VentureBeat
  56. ^ 「Swiftを使用する利点」themindstudios.com2017年2月24日2017年2月24日取得
  57. ^ 「クロージャー— Swiftプログラミング言語(Swift5.5)」docs.swift.org 2021年8月31日取得
  58. ^ マコンバー、カイル; Yaskevich、Yavel; グレゴール、ダグ; マッコール、ジョン。「複数の末尾のクロージャ」GitHub 2020年10月19日取得
  59. ^ ラトナー、クリス。「条件で末尾のクロージャを許可する」 。GitHub 2020年10月19日取得guard
  60. ^ 「文字列と文字」developer.apple.comApple Inc. 2014年7月16日取得
  61. ^ 「アクセス制御」developer.apple.comApple Inc. 2016年10月25日取得
  62. ^ 「NullableTypes」、C#プログラミングガイド、Microsoft。
  63. ^ 「タイプ」developer.apple.comApple Inc. 2014年7月16日取得
  64. ^ a b "クラスと構造"Apple.com
  65. ^ Guhit、Fiel(2015年2月14日)。「Swift1.1、Swift 1.2、およびObjective-Cのパフォーマンスケーススタディ」
  66. ^ 値型を使用してより優れたアプリを構築するアップル。
  67. ^ a bc 「 NSCopying プロトコルリファレンス」アップル
  68. ^ 「プロトコルの操作」アップル
  69. ^ トンプソン、マット(2014年9月2日)。「Swiftのデフォルトプロトコルの実装」NSHipster
  70. ^ 「SwiftベースのアプリはmacOS10.9 / iOS 7以下で動作しますか?」、 スタックオーバーフロー
  71. ^ 「CocoaおよびObjective-CでのSwiftの使用:基本設定」apple.com2015年1月6日。
  72. ^ 「Objective-Cの振る舞いでSwiftクラスを書く」、Apple Inc.
  73. ^ 「Objective-CコードのSwiftへの移行」
  74. ^ 「同じプロジェクトのSwiftとObjective-C」、Apple Inc.
  75. ^ 「Apple:「corelib」を検索" 。GitHub_
  76. ^ 「Xcode-SwiftUI-AppleDeveloper」developer.apple.com 2021年2月1日取得
  77. ^ 「自動参照カウント」、Apple Inc.
  78. ^ ラニエ、ブライアン; グロッフ、ジョー。「中級スウィフト」アップル2014年7月3日取得
  79. ^ メッツ、ケイド。「なぜコーダーはAppleの新しいプログラミング言語に夢中になっているのか」有線2014年7月16日取得
  80. ^ Swift
  81. ^ 「Swiftパフォーマンスの最適化」Apple、Inc. 2015年6月。
  82. ^ 「Swift-Languageでのエラー処理」stackoverflow.com
  83. ^ 「apple / swift-evolution」GitHub 2016年4月4日取得
  84. ^ 「apple / swift-evolution」GitHub 2016年4月4日取得
  85. ^ バルボサ、グレッグ(2016年2月22日)。「IBMはSwiftをクラウドに導入し、Appleのプログラミング言語で記述されたWebフレームワークKituraをリリースします」9to5Mac 2016年5月16日取得
  86. ^ 「サーバーAPIワークグループ」Swift.org2016年10月25日2016年10月28日取得
  87. ^ 「Swift.org」Swift.org 2016年10月28日取得
  88. ^ 「RemObjects要素コンパイラ」2016年1月17日取得
  89. ^ ローズ、ジョーダン(2020年4月1日)。「MacOS9のSwift」-dealloc

外部リンク