web-dev-qa-db-ja.com

「let」キーワードがSwiftで定数/不変を定義するために使用される場合、「static」キーワードの使用は何ですか?

Swiftでstaticキーワードを使用することについて少し混乱しています。知っているように、Swiftはletキーワードを導入して不変オブジェクトを宣言します。おそらく、その存続期間中に変更されないテーブルビューセルのIDを宣言するようなものです。ここで、構造体の宣言でstaticキーワードを使用すると次のようになります。

struct classConstants
{
    static let test = "test"
    static var totalCount = 0
}

一方、letキーワードは同じことを行います。ObjectiveCでは、staticを使用して次のような定数を宣言します。

static NSString *cellIdentifier=@"cellId";

それに加えて、letおよびvarキーワードと一緒にstaticキーワードを使用することも興味をそそります。誰がこの静的キーワードを使用するかを説明できますか?さらに重要なのは、Swiftで本当に必要なのはstaticですか?

51
Poles

私はあなたのためにそれらを分解します:

  • var:変数の作成に使用
  • let:定数の作成に使用
  • staticletまたはvarのいずれかで type properties を作成するために使用されます。これらは、クラスのすべてのオブジェクト間で共有されます。

これで、目的の結果を得るために組み合わせることができます。

  • static let key = "API_KEY":定数のタイププロパティ
  • static var cnt = 0:変数であるtypeプロパティ
  • let id = 0:定数(一度だけ割り当てることができますが、実行時に割り当てることができます)
  • var price = 0:変数

だから、すべてをvarにまとめて、静的で定義スコープの欠如の間に可変性を定義させます。 static varを使用して作成したインスタンスの数を追跡し、オブジェクトごとに異なる価格でvarのみを使用することもできます。これが少し物事をクリアすることを願っています。

サンプルコード:

class MyClass{
    static let typeProperty = "API_KEY"
    static var instancesOfMyClass = 0
    var price = 9.99
    let id = 5

}

let obj = MyClass()
obj.price // 9.99
obj.id // 5

MyClass.typeProperty // "API_KEY"
MyClass.instancesOfMyClass // 0
110
Alex Pelletier

静的変数は、クラスのすべてのインスタンスを通じて共有されます。遊び場でこの例を投げます:

class Vehicle {
    var car = "Lexus"
    static var suv = "Jeep"
}

// changing nonstatic variable
Vehicle().car // Lexus
Vehicle().car = "Mercedes"
Vehicle().car // Lexus

// changing static variable
Vehicle.suv // Jeep
Vehicle.suv = "Hummer"
Vehicle.suv // Hummer

静的プロパティの変数を変更すると、そのプロパティは将来のすべてのインスタンスで変更されるようになりました。

86
Bobby

静的変数は、クラスのインスタンスではなく型に属します。型の完全な名前を使用して、静的変数にアクセスできます。

コード:

class IOS {

  var iosStoredTypeProperty = "iOS Developer"

  static var swiftStoredTypeProperty = "Swift Developer"

 }

 //Access the iosStoredTypeProperty by way of creating instance of IOS Class

let iOSObj = IOS()

print(iOSObj.iosStoredTypeProperty)  // iOS Developer


 //print(iOSObj.swiftStoredTypeProperty) 
 //Xcode shows the error 
 //"static member 'swiftStoredTypeProperty' cannot be used on instance of type IOS”


 //You can access the static property by using full name of the type
print(IOS.swiftStoredTypeProperty)  // Swift Developer

これがお役に立てば幸いです。

10
Vinoth Vino

型プロパティおよび/またはメソッドとクラスプロパティおよび/またはメソッドの違いを確認するには、Apple docsからこの自明の例を見てください

class SomeClass {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 27
    }
    class var overrideableComputedTypeProperty: Int {
        return 107
    }
}

静的プロパティは、型ではなくグローバルに宣言できます。言い換えると、Swiftの静的プロパティ=== typeプロパティです。型プロパティを宣言するには、静的キーワードを使用する必要があります。

1
user3441734

"letキーワードは定数を定義します"は、C#のバックグラウンド(私のような)から来た初心者にとって混乱を招きます。 C#の用語では、「let」を「readonly」変数と考えることができます

「let」キーワードはSwiftでどのように機能しますか?

staticletの両方を使用して定数を定義します

public static let pi = 3.1416            // Swift

public const double pi = 3.1416;         // C#
public static final double pi = 3.1416   // Java     

letを使用して定数を定義するたびに、C#のreadonlyを使用しているように感じます。したがって、staticletの両方を使用して、Swiftで定数を定義します。

1
Hassan Tareq