値型と不変性
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フィードバックを取得できます。ローカル設定は不要です。