サーチ…


構造の基礎

struct Repository {
    let identifier: Int
    let name: String
    var description: String?
}

これは、3つの格納されたプロパティ、整数identifier 、文字列name 、およびオプションの文字列description持つRepository構造体を定義しRepositoryidentifiernameは、 let -keywordを使って宣言されている定数です。初期化中に設定されると、変更することはできません。説明は変数です。変更すると、構造体の値が更新されます。

構造体型は、独自のカスタムイニシャライザを定義していない場合、メンバーワイヤイニシャライザを自動的に受け取ります。既定値を持たないプロパティを格納していても、構造体は初期化子を受け取ります。

Repositoryには、 descriptionのみがデフォルト値( nil )を持つ3つの格納されたプロパティが含まれます。さらにそれ自身のイニシャライザも定義していないので、それは無料でメンバワイズイニシャライザを受け取ります:

let newRepository = Repository(identifier: 0, name: "New Repository", description: "Brand New Repository")

構造体は値型です

参照によって渡されるクラスとは異なり、構造体はコピーによって渡されます。

first = "Hello"
second = first
first += " World!"
// first == "Hello World!"
// second == "Hello"

Stringは構造体なので、代入時にコピーされます。

構造体は、アイデンティティ演算子を使用して比較することもできません。

window0 === window1 // works because a window is a class instance
"hello" === "hello" // error: binary operator '===' cannot be applied to two 'String' operands

2つの構造インスタンスはすべて等しいとみなされる場合、同一とみなされます。

集合的に、クラスと構造を区別するこれらの特性は、構造の値の型を作るものです。

構造体の突然変異

構造体自体の値を変更する構造体のメソッドの前には、 mutatingキーワードを付ける必要があります

struct Counter {
    private var value = 0
    
    mutating func next() {
        value += 1
    }
}

あなたは突然変異の方法を使用することができます

mutatingメソッドは、変数内の構造体値でのみ使用できます。

var counter = Counter()
counter.next()

あなたが突然変異の方法を使うことができないとき

一方、 mutatingの方法は、定数の内部構造体の値では使用できません

let counter = Counter()
counter.next()
//  error: cannot use mutating member on immutable value: 'counter' is a 'let' constant

構造体は継承できません

クラスとは異なり、構造体は継承できません:

class MyView: NSView { }  // works

struct MyInt: Int { } // error: inheritance from non-protocol type 'Int'

しかし、構造はプロトコルを採用することができます:

struct Vector: Hashable { ... }  // works

構造体のメンバーへのアクセス

Swiftでは、構造体は単純な「ドット構文」を使用してメンバーにアクセスします。

例えば:

struct DeliveryRange {
  var range: Double
  let center: Location
}
let storeLocation = Location(latitude: 44.9871,
                             longitude: -93.2758)
var pizzaRange = DeliveryRange(range: 200,
                               center: storeLocation)

次のように範囲にアクセス(印刷)することができます:

    print(pizzaRange.range) // 200

ドット構文を使用してメンバーのメンバーにアクセスすることもできます:

 print(pizzaRange.center.latitude) // 44.9871

ドット構文で値を読み取る方法と同様に、それらを割り当てることもできます。

pizzaRange.range = 250


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow