iOSを使ってみる
Swift VS Objective-C
プログラミングパラダイム
-
Swiftには、プロトコル指向プログラミング、関数型プログラミング、オブジェクト指向プログラミングがあります。
-
Objective-Cは主にオブジェクト指向プログラミングに基づいていますが、関数型プログラミングのためにReactiveCocoaに似たクラスライブラリを導入することもできます。
タイプセーフ
-
Swiftはタイプセーフな言語です。プログラマーは、コード内の値のタイプについて明確にすることが推奨されます。文字列がコードで使用されている場合、整数のIntを誤ってそれに渡すことはできません。Swiftはタイプセーフであるため、コードのコンパイル時にタイプチェックを実行し、不一致のタイプがあればエラーとしてフラグを立てます。これにより、プログラマは開発のできるだけ早い段階でエラーを発見して修正できます。
-
Objective-Cはそうではありません。NSString変数を宣言した場合でも、NSNumberを変数に渡すことができます。コンパイラーは文句を言いますが、それをNSNumberとして使用できます。
言語特性
-
Swift構文では、クラス、拡張機能、プロパティをより簡潔に定義できます。ヘッダーはプロジェクト全体で削除され、ヘッダーファイルの導入はより近代的です。
-
Objective-Cは、クラスとメソッドを定義するのがより面倒です。
開発と応用
-
2014年以降、Swiftは5つのメジャーバージョンと10以上のマイナーバージョンを含む15のバージョンをリリースしており、現在の5.xバージョンは基本的に安定しており、サードパーティのライブラリソースはほとんどありません。
-
Swiftは2015年12月に正式にオープンソースになりました。現在、Swiftは、サーバー側の開発やTensorFlow(さまざまな機械学習アルゴリズムのプログラミングに使用されるデータフロープログラミングに基づく)など、多くの分野に適用できます。Swift言語バージョンもあります。
-
Objective-Cには1980年代から現在までのバージョンが2つしかなく、成熟した開発と豊富な3者ライブラリソースがあり、主にリンゴの生態学的アプリケーションの開発に使用されています。
チョイス
要因の組み合わせにより、iOS開発の導入において、Swiftを選択して開始することはより友好的で将来性のあるものになりますが、iOS開発を深く習得するためには、Objective-Cも不可欠な基盤です。
Swift基本紹介
変数と定数
-
声明
-
キーワードletを使用して定数を宣言する
-
キーワードvarを使用して変数を宣言する
-
複数の変数または定数をカンマで区切って1行で宣言できます
-
-
タイプ注釈
-
変数または定数を宣言するときに型注釈を提供して、変数または定数が格納できる値の型を明確にする
-
型注釈を追加する方法は、変数または定数の名前の後にコロンを追加し、その後にスペースを追加して、最後に使用する型名を追加することです
-
タイプタグが最後の変数名の後に追加されている限り、カンマで区切って、同じタイプの複数の関連する変数を1行に定義できます。
-
-
変数と定数の命名
-
定数名と変数名には、Unicode文字を含め、ほとんどすべての文字を使用できます
-
定数と変数の名前には、空白文字、数学記号、矢印、予約済み(または無効)のUnicodeコードポイント、行、タブを含めることはできません。数字で始めることはできませんが、数字は名前の他のほとんどの場所で使用できます
-
-
定数と変数を出力する
-
print(_:separator:terminator :)
-
文字列補間
-
基本的なデータ型
-
整数
-
Swiftは、8、16、32、64ビットの符号付き、符号なし整数を提供します
-
命名方法:たとえば、8ビットの符号なし整数のタイプはUInt8で、32ビットの符号付き整数のタイプはInt32です。minおよびmax属性は、各整数タイプの最小値と最大値にアクセスするために使用されます。
-
Swiftは、追加の整数型Intを提供します。これは、現在のプラットフォームのネイティブワードと同じ長さです。Swiftは、プラットフォーム長に関連する符号なし整数を表すUInt型も提供します。整数が使用される場合は常にIntを使用することをお勧めします
-
-
浮動小数点タイプ
-
倍精度:15桁以上の精度を持つ64ビット浮動小数点数
-
Float:精度が6桁以上の32ビット浮動小数点数
-
両方のタイプが可能な場合は、ダブルタイプをお勧めします。
-
-
ブール
- Bool:trueとfalse。Swiftのタイプセーフティメカニズムにより、Boolを非ブール値に置き換えることができなくなります。
タイプエイリアス
-
タイプエイリアスは、既存のタイプに対して定義された代替名です
-
キーワードtypealiasによって型エイリアスを定義できます
-
エイリアスは、コンテキストでより適切に見えて表現できる名前で既存のタイプを参照する場合に非常に役立ちます。
タプルタプル
-
タプルは複数の値を単一の複合値に結合します
-
タプルの値は任意のタイプにすることができ、同じタイプである必要はありません
-
要素の命名
-
タプルの各要素は、対応する要素名を指定できます
-
指定した名前の要素がない場合は、添え字メソッドを使用して引用することもできます
-
-
タプルの変更
-
varで定義されたタプルは可変タプルであり、letは不変のタプルを定義します
-
変数タプルでも不変タプルでも、タプルは作成後に要素を追加および削除できません
-
可変タプルの要素は変更できますが、タイプは変更できません
-
任意のタイプを任意のタイプに変更できます
-
-
タプル分解
-
タプルの内容を個々の定数または変数に分解するには
-
データの一部のみを使用する必要がある場合は、不要なデータを下向きの線(_)で置き換えることができます。
-
-
関数の戻り値として
-
タプルを使用して関数の複数の値を返す
-
戻り値のタプルは、関数の戻り値型の部分で名前を付けることができます
-
オプション
-
追加することによって?変数タイプの後に、それは意味します:
-
ここに値があり、xまたは
-
ここには価値はありません
-
-
nilを割り当てることで、オプションの変数に値を設定できません。
- Swiftでは、nilはポインターではなく、値が欠落している特殊なタイプです。オブジェクトタイプだけでなく、任意のタイプのオプションをnilに設定できます
-
Optional-Ifステートメントと強制拡張
- このオプションは直接使用できません。拡張後に使用する必要があります(つまり、このオプションに値があり、拡張する必要があることが明確にわかっています)
-
オプションの力の拡張
- 使用!存在しないオプション値を取得すると、実行時エラーが発生します。使用する前に、オプション項目に非nil値が含まれていることを確認する必要があります!
-
オプションのバインディング
-
オプションバインディングを使用して、オプションに値が含まれているかどうかを判断し、含まれている場合は、その値を一時的な定数または変数に割り当てることができます。
-
オプションのバインディングをifステートメントとwhileステートメントで使用して、オプション内の値を確認し、変数または定数に割り当てることができます
-
同じifステートメントに、コンマで区切られた複数のオプションバインディングが含まれています。オプションのバインディング結果がnilまたはブール値がfalseの場合、if判定全体がfalseと見なされます
-
-
オプションの暗黙の拡張
-
一部のオプションは、一度設定すると常に値を持ちます。この場合、検査の必要をなくすことができ、アクセスするたびに展開する必要はありません。
-
宣言された型の後に疑問符(String?)の代わりに感嘆符(String!)を追加して、暗黙の拡張オプションを記述します。
-
暗黙的な拡張オプションは、主にSwiftクラスの初期化プロセスで使用されます
-
文字列
-
初期化
-
リテラル:文字列リテラルは、二重引用符( ")で囲まれた固定順序のテキスト文字です。
-
複数行リテラル:複数行文字列リテラルは、3つの二重引用符で囲まれた一連の文字で、バックスラッシュ(\)を使用して折り返します
-
初期化構文
-
isEmptyは空の文字列かどうかを確認します
-
-
文字列内の特殊文字
- エスケープ特殊文字\ 0(ヌル文字)、\(バックスラッシュ)、\ t(水平タブ)、\ n(改行)、\ r(復帰)、 "(二重引用符)および '( (一重引用符)
-
文字列操作
-
varは変更できます
-
letによる変更不可
-
-
操作キャラクター
-
文字列内の独立した各文字のfor-inループ
-
文字列値は、文字配列を渡すことで作成できます
-
-
文字列の連結
-
プラス演算子(+)を使用して新しい文字列を作成する
-
プラス割り当て記号(+ =)を使用して、既存のストリング値の末尾にストリング値を追加します
-
String型のappend()メソッドを使用して、String変数の最後にCharacter値を追加します
-
-
文字列補間
-
文字列補間は、定数、変数、リテラル、および式を組み合わせた文字列リテラルから新しい文字列値を構築する方法です
-
文字列リテラルに挿入する各要素は、一対の括弧で囲み、バックスラッシュを前に付ける必要があります
-
-
文字列インデックス
-
各文字列値には、文字列内の各文字の位置に相当する、関連付けられたインデックスタイプString.Indexがあります。
-
文字列の最初の文字の位置にアクセスするためのstartIndexプロパティ。
-
endIndexプロパティは、文字列の最後の文字の後の位置です
-
Stringが空の場合、startIndexとendIndexは等しい
-
文字配列の使用は、添え字を介して直接アクセスすることはできません。Stringの添え字メソッドは、Int添え字をまったくサポートしていません。
-
index(before :)およびindex(after :)メソッドを使用して、指定されたインデックスの前後にアクセスします。
-
特定のインデックスからより遠いインデックスにアクセスするには、インデックス(_:offsetBy :)を使用できます。
-
indicesプロパティを使用して、文字列内の各文字のインデックスにアクセスします
-
-
挿入
-
文字を挿入するには、挿入(_:at :)メソッドを使用します
-
別の文字列のコンテンツを特定のインデックスに挿入するには、insert(contentsOf:at :)メソッドを使用します
-
-
削除する
-
文字を削除するには、remove(at :)メソッドを使用します
-
特定の文字列の小さな範囲を削除するには、removeSubrange(_ :)メソッドを使用します
-
-
文字列比較
-
文字列と文字の等価性(==および!=)
-
プレフィックスの同等性hasPrefix(_ :)
-
サフィックスの等価性hasSuffix(_ :)
-