mutatingキーワード
structやenumの状態を変更するメソッドを記述します。
「mutatingキーワード」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。
メソッドはデフォルトでは変更できない
struct のインスタンスメソッドは、mutating とマークされていない限り、構造体の保存プロパティを変更できません。
struct Counter {
var value = 0
mutating func increment() {
value += 1
}
}
var c = Counter()
c.increment()
print(c.value)mutating が必要な理由
struct は値型であるため、変更を明示するために、コンパイラは mutating の使用を明示的に選択するよう求めます。
struct Bank {
var balance = 0
mutating func deposit(_ amount: Int) {
balance += amount
}
}
var b = Bank()
b.deposit(50)
print(b.balance)非 mutating メソッド
プロパティを読み取るだけのメソッドには、mutating は必要ありません。
struct Rectangle {
var width = 0
var height = 0
func area() -> Int {
return width * height
}
}
let r = Rectangle(width: 3, height: 4)
print(r.area())enum での mutating
enum にも、インスタンスを別のケースに切り替える mutating メソッドを定義できます。
enum Light {
case on, off
mutating func toggle() {
self = (self == .on) ? .off : .on
}
}
var l = Light.off
l.toggle()
print(l)let では呼び出せない
定数(let)のインスタンスでは mutating メソッドを呼び出せません。呼び出すとコンパイルエラーになります。
struct Counter {
var value = 0
mutating func bump() { value += 1 }
}
var c = Counter()
c.bump()
// let d = Counter(); d.bump() // error
print(c.value)複数のプロパティを変更する
1つの mutating メソッドで、複数のプロパティを同時に変更できます。
struct Player {
var x = 0
var y = 0
mutating func move(dx: Int, dy: Int) {
x += dx
y += dy
}
}
var p = Player()
p.move(dx: 3, dy: 5)
print(p.x, p.y)値を返す mutating
mutating メソッドは、状態を変更しながら値を返すこともできます。
struct Stack {
var items: [Int] = []
mutating func pop() -> Int? {
return items.popLast()
}
}
var s = Stack(items: [1, 2, 3])
print(s.pop() ?? -1)
print(s.items)標準ライブラリでの mutating
Array の append などのメソッドは mutating です。そのため、呼び出す配列には var が必要です。
var nums = [1, 2]
nums.append(3)
print(nums)mutating と計算される状態
mutating メソッド内で派生状態を更新し、常に不変条件を保てます。
struct Wallet {
var coins = 0
var label = "empty"
mutating func add(_ n: Int) {
coins += n
label = coins > 0 ? "has coins" : "empty"
}
}
var w = Wallet()
w.add(5)
print(w.coins, w.label)順序が重要
mutating メソッド内の文は上から下へ実行されるため、後の行では前の行による変更が反映されます。
struct Accumulator {
var total = 0
mutating func process() {
total += 1
total *= 10
}
}
var a = Accumulator()
a.process()
print(a.total)クラスに mutating は不要
参照型(class)は値型ではないため、キーワードを付けなくてもプロパティを変更できます。
class Box {
var value = 0
func bump() { value += 1 }
}
let box = Box()
box.bump()
print(box.value)クイックチェック
mutating キーワードを確認しましょう。
まとめ
struct または enum のインスタンスメソッドが格納プロパティを変更する場合は、mutating を付けます。enum の場合は、ケースを切り替えるときにも付けます。このようなメソッドは let のインスタンスでは呼び出せません。クラスは参照型なので、mutating は必要ありません。
struct C { var v = 0; mutating func inc() { v += 1 } }
var c = C()
c.inc()
print(c.v)よくある質問
「mutatingキーワード」レッスンは無料ですか?
はい。「mutatingキーワード」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。
「mutatingキーワード」で何を学びますか?
structやenumの状態を変更するメソッドを記述します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Swift Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「mutatingキーワード」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSwift Academyレッスンでコードを書いて実行できますか?
はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 値型と不変性
- mutatingキーワード
- mutatingとselfの再代入
- 非変更の代替手段