静的メンバー
CoddyのSwiftジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 14/57。
staticプロパティは、インスタンスではなく型そのものに属します。コピーは1つだけ存在し、型名を通して読み取ります。
struct Temperature {
static let freezing = 0.0
static let boiling = 100.0
var celsius: Double
}
print(Temperature.boiling - Temperature.freezing)出力:
100.0static var は変更できるため、作成されたインスタンスの数を数えるカウンターなど、すべてのインスタンスで共有するデータに便利です。
class Ticket {
static var issued = 0
let number: Int
init() {
Ticket.issued += 1
number = Ticket.issued
}
}
let a = Ticket()
let b = Ticket()
print(a.number)
print(b.number)
print(Ticket.issued)出力:
1
2
2static func は型に対して呼び出されます。操作対象となる self インスタンスを持たないため、引数とその他の静的メンバーだけを使用します。ヘルパーや、インスタンスを構築する名前付きの方法を置くのに適しています。
struct Color {
var red: Int
var green: Int
var blue: Int
static func gray(_ level: Int) -> Color {
Color(red: level, green: level, blue: level)
}
}
let c = Color.gray(128)
print(c.red + c.green + c.blue)出力:
384型の内部では、Self はその型を表す別の名前なので、静的メンバーは Self.issued と記述できます。インスタンスメソッドは静的メンバーを読み取れますが、静的メソッドはインスタンスプロパティを読み取れません。これは、静的メソッドがインスタンス上で呼び出されるものではないためです。
struct Level {
static let maximum = 10
var current = 1
func isMax() -> Bool { current == Self.maximum } // インスタンスが static を読み取る
static func describe() -> String { "levels 1-\(maximum)" } // static が static を読み取る
}チャレンジ
簡単クラス Orderを完成させてください。静的プロパティ nextIdは1から始まり、新しい注文ごとに現在のnextIdをそのidとして割り当て、値を増加させます。静的定数taxPercentは10です。インスタンスメソッドtotal()は、小計に税を加えた値(切り捨て)を返し、静的メソッドsummary(of:)は注文の配列を受け取り、3 orders, 660 totalを返します。
提供されたコードは1行ごとに小計を読み取り、それぞれについて注文を作成し、各注文に対して#1: 110を出力し、最後に概要を出力します。
コードはOrder.swiftに記述します。main.swiftには提供された入出力コードが含まれており、編集できません。
自分で試してみよう
// 提供された入出力コード: そのままにしておく
var input: [String] = []
while let line = readLine() { input.append(line) }
var orders: [Order] = []
for line in input {
let order = Order(subtotal: Int(line)!)
orders.append(order)
print("#\(order.id): \(order.total())")
}
print(Order.summary(of: orders))
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Swiftプレイグラウンド