Menu
Coddy logo textTech

構造体

CoddyのSwiftジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 7/57。

構造体は、クラスのようにデータとメソッドをまとめます。Swift はすべての構造体に対して、各プロパティにつき1つのパラメーターを持つメンバーワイズイニシャライザを記述するため、構造体自身に init は必要ありません:

struct Point {
    var x: Int
    var y: Int

    func distanceFromOrigin() -> Int {
        abs(x) + abs(y)
    }
}

let p = Point(x: 3, y: -4)
print(p.x)
print(p.distanceFromOrigin())

出力:

3
7

デフォルト値を持つプロパティは、メンバーワイズイニシャライザから省略できます。

struct Settings {
    var volume = 5
    var muted = false
}

let quiet = Settings(volume: 1)
print(quiet.volume)
print(quiet.muted)

出力:

1
false

let定数に格納された構造体は、そのvarプロパティでさえまったく変更できません。変更するにはvarに格納します。

let fixed = Point(x: 1, y: 2)
// fixed.x = 5    // エラー: 代入できません。fixed は let 定数です

var moving = Point(x: 1, y: 2)
moving.x = 5       // 問題なし

Swift 独自の型の多くは構造体です:Int、Double、String、Array、Dictionary。あなたの構造体もこれらの型と同じように動作します:単純な値です。

struct Money {
    var cents: Int
    func formatted() -> String {
        "\(cents / 100).\(cents % 100 < 10 ? "0" : "")\(cents % 100)"
    }
}

print(Money(cents: 1250).formatted())
print(Money(cents: 305).formatted())

出力:

12.50
3.05
challenge icon

チャレンジ

簡単

プロパティ name(String)、price(Int、セント単位)、quantity(Int)を持つ構造体 Item を宣言してください。price と quantity の積を返すメソッド total() と、2 x tea = 350 を返すメソッド line() を追加してください。

提供されたコードは、name,price,quantity として1行につき1つのアイテムを読み取り、メンバーごとのイニシャライザで各 Item を作成し、line() を出力します。その後、sum: とすべての合計値の合計を出力します。

コードは Item.swift に記述してください。main.swift には提供された入出力コードが含まれており、編集できません。

自分で試してみよう

// 提供された入出力コード: そのままにしておく
var input: [String] = []
while let line = readLine() { input.append(line) }
var sum = 0
for row in input {
    let p = row.split(separator: ",").map(String.init)
    let item = Item(name: p[0], price: Int(p[1])!, quantity: Int(p[2])!)
    print(item.line())
    sum += item.total()
}
print("sum: \(sum)")
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Swiftプレイグラウンド