Swiftのクラス[パート1]

最近、AppleはiOSアプリケーションの開発におけるかなり重要な変更を一般に紹介し、新しいプログラミング言語Swiftを発表しました。 現在、この言語専用のロシア語の資料の数は限られています。 また、Swiftはオブジェクト指向言語であり、その中のクラスは基本の基礎です。 そこで、この記事を翻訳することにしました。



クラス作成


新しいクラスを作成するには、 classキーワード、 classの名前、および中括弧を使用します。これらの内部では、クラスのプロパティとメソッドが宣言されます。
 class Point { var x = 0.0 // sets the default value of x to 0 var y = 0.0 // sets the default value of x to 0 } // this creates a new Point instance using the default initializer var point = Point() point.x = 100 // sets the x property to 100 point.y = 200 // sets the y property to 200 


初期化子


Apple公式ドキュメントから
初期化は、将来の使用のためにクラス、構造、または列挙のインスタンスを準備するプロセスです。 各プロパティの初期化と、最初の使用前に必要な他の設定または初期化の実行が含まれます。

初期化プロセスは、新しいクラスインスタンスが宣言されたときに呼び出される特別なメソッドであるイニシャライザーを使用して実装されます。 Objective-Cとは異なり、Swiftの初期化子は何も返しません。 クラスの新しいインスタンスの正しい初期化を保証します。

例を見てみましょう
 class Point { var x var y } 

実行すると、3つのコンパイルエラーが発生します。
 class Point { // Class 'Point' has no initializers ( <code>Point</code>   ) var x // Type annotation missing in pattern (  ) var y // Type annotation missing in pattern (  ) } 

これを修正するには、各プロパティのタイプを設定しましょう
 class Point { var x: Double var y: Double } 


初期化子は、 initキーワードで指定されinit 。 イニシャライザには複数のパラメータがある場合がありますが、まったくない場合もあります
 class Point { var x: Float var y: Float init(x: Float, y: Float) { self.x = x self.y = y } } // Example usage var point = Point(x: 100, y: 200) 


オプションのプロパティ値を設定することもできます。 これを行うには、それを置くだけ? 例に示すように、タイプの後。 この方法でプロパティを宣言すると、デフォルト値はnilます。
 class Point { var x: Float? var y: Float? } var point = Point() // both the x and y properties are now set to nil point.x = 100.0 point.y = 200.0 


初期化子のオーバーロード


プロジェクトの作成中に、ユーザーのリストを使用する必要が生じたと想像してください。 最初にUserクラスを作成しましょう。 各クラスオブジェクトには、名( firstName )、姓( lastName )、簡単なユーザー情報( bio )のフィールドがあります。 姓と名のフィールドにはオプションの値があり、簡潔な情報フィールドにはデフォルト値があります(つまり、このフィールドはオプションです)。
 class User { var firstName: String? var lastName: String? var bio: String = "I ♡ Swift!" } var user = User() // user = { firstName: nil, lastName: nil, bio: "I ♡ Swift!"} 


さて、クラスを作成しました。 次に、最初のユーザーを作成します。 簡単な情報フィールドはオプションなので、初期化子をオーバーロードする必要があります。 プレイヤーについて何かを書いたり、プレイヤーに暗い性格を残すことができます。 それでは、両方のケースのイニシャライザを書きましょう。

 class User { var firstName: String var lastName: String var bio: String = "I ♡ Swift!" // no bio provided init(firstName: String, lastName: String) { self.firstName = firstName self.lastName = lastName } // bio provided init(firstName: String, lastName: String, bio: String) { self.firstName = firstName self.lastName = lastName self.bio = bio } } var me = User(firstName: "Andrei", lastName: "Puni") // me = { firstName: "Andrei", lastName: "Puni", bio: "I ♡ Swift!"} var silviu = User(firstName: "Silviu", lastName: "Pop", bio: "I f**ing ♡ Swift!!!") // silviu = { firstName: "Silviu", lastName: "Pop", bio: "I f**ing ♡ Swift!!!"} 


ただし、初期化の違いは最小限であるため、これは完全に合理的ではありません。誰かに関する情報はありますが、誰かに関する情報はありません。 したがって、1つの初期化子を記述し、引数bioデフォルト値を与えましょう。

 class User { var firstName: String var lastName: String var bio: String init(firstName: String, lastName: String, bio: String = "I ♡ Swift!") { self.firstName = firstName self.lastName = lastName self.bio = bio } } var me = User(firstName: "Andrei", lastName: "Puni") // me = { firstName: "Andrei", lastName: "Puni", bio: "I ♡ Swift!"} var silviu = User(firstName: "Silviu", lastName: "Pop", bio: "I f**ing ♡ Swift!!!") // silviu = { firstName: "Silviu", lastName: "Pop", bio: "I f**ing ♡ Swift!!!"} 


クラスアイデンティティ


Apple公式ドキュメントから
アイデンティティ演算子

クラスは参照型であるため、クラスの同じインスタンスが複数の変数または定数によって示される場合、状況が発生する可能性があります。 (これは構造体と列挙型では不可能です。どちらも重要なタイプであり、割り当てられてパラメーターとして関数に渡されるとコピーされるためです)

2つの変数または定数がクラスの同じインスタンスを参照していることがわかると便利な場合があります。 Swiftにはこのための2つの演算子があります。
同一( ===
同一ではない( !==

プレイヤーのリストがあり、そのうちの1人が城の所有者であるとします。 城の所有者ではないプレイヤーのためにいくつかの機能を追加する必要があります。 これを行うには、ID演算子( === )を使用しましょう
 var users: User[] = [ ... ] // User[] means Array of Users var host = /* some user */ for user in users { if user === host { // host logic here println("this is the host") } else { // guest logic here println("this is a guest") } } 


クラスオブジェクトを比較する場合、等号演算子( == )は機能しないため、このようなエラーを恐れる必要はありません。

次のパートでは、クラスの継承とプロトコルについて見ていきます。

Source: https://habr.com/ru/post/J231739/


All Articles