0Pricing
Swift Academy · レッスン

値型と不変性

letによって値型の変更がどのように防止されるかを確認します。

「値型と不変性」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

構造体は値型

Swiftでは、struct と enum は値型です。新しい変数に代入するとコピーされます。

struct Point { var x: Int; var y: Int }
var a = Point(x: 1, y: 2)
var copy = a
copy.x = 99
print(a.x, copy.x)

letは値全体を固定する

let で構造体を宣言すると、すべてのプロパティを含め、値全体が不変になります。

struct Counter { var value: Int }
let c = Counter(value: 0)
// c.value = 5 // compile error
print(c.value)

varは変更を許可する

作成後に構造体のプロパティを変更する場合は、var を使用してください。

struct Counter { var value: Int }
var c = Counter(value: 0)
c.value = 5
print(c.value)

代入時のコピー

各変数は、それぞれ独立したコピーを保持します。一方を変更しても、もう一方に影響することはありません。

struct Box { var label: String }
var first = Box(label: "A")
var second = first
second.label = "B"
print(first.label, second.label)

関数における値セマンティクス

構造体を関数に渡すとコピーが渡されます。関数の外側にある元の値は変更されません。

struct Score { var points: Int }
func bump(_ s: Score) {
    var local = s
    local.points += 10
}
var s = Score(points: 0)
bump(s)
print(s.points)

不変のプロパティ

構造体内で let と宣言されたプロパティは、var のインスタンスであっても変更できません。

struct User { let id: Int; var name: String }
var u = User(id: 1, name: "Ada")
u.name = "Bob"
// u.id = 2 // compile error
print(u.id, u.name)

配列も値型

Swiftの Array、Dictionary、Set は構造体であるため、代入時にコピーされます。

var a = [1, 2, 3]
var b = a
b.append(4)
print(a)
print(b)

文字列は値型

String も値型です。コピーを変更しても、元の値はそのままです。

var s1 = "hi"
var s2 = s1
s2 += " there"
print(s1)
print(s2)

値型が役立つ理由

値セマンティクスによって、共有状態に関する意図しないバグを防げます。ほかの誰が参照を保持しているかを気にせず、値をその場で判断できます。

struct Config { var retries: Int }
let defaultConfig = Config(retries: 3)
var custom = defaultConfig
custom.retries = 5
print(defaultConfig.retries, custom.retries)

不変性と安全性

可能な限り値に let を付けると、コードの安全性と明確さが増します。コンパイラによって、値が決して変更されないことが保証されます。

let limit = 100
let name = "stable"
print(limit, name)

let変数の再代入は失敗する

let の束縛を再代入することも、それが保持する値を変更することもできません。

let pi = 3.14
// pi = 3.15 // compile error
print(pi)

確認テスト

値型の動作をテストしてください。

まとめ

構造体と列挙型は値型であり、代入時や関数に渡すときにコピーされます。let の束縛は値全体を固定し、let のプロパティは決して変更できません。これにより、予測しやすく分離された状態を保てます。

struct P { var n: Int }
var a = P(n: 1)
var b = a
b.n = 9
print(a.n, b.n)

よくある質問

「値型と不変性」レッスンは無料ですか?

はい。「値型と不変性」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「値型と不変性」で何を学びますか?

letによって値型の変更がどのように防止されるかを確認します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「値型と不変性」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 値型と不変性
  2. mutatingキーワード
  3. mutatingとselfの再代入
  4. 非変更の代替手段
← Swift Academyに戻る