Swift Language
構造
サーチ…
構造の基礎
struct Repository {
let identifier: Int
let name: String
var description: String?
}
これは、3つの格納されたプロパティ、整数identifier
、文字列name
、およびオプションの文字列description
持つRepository
構造体を定義しRepository
。 identifier
とname
は、 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