μλ νμΈμ. μ€λμ Swiftμ 'μ΅μ λ 체μ΄λ(Optional Chaining)'μ λν΄ μμλ³΄κ² μ΅λλ€.
π μ΅μ λ 체μ΄λμ΄λ?
μ΅μ λ 체μ΄λμ νμ¬ nilμΌ μλ μλ μ΅μ λ κ°μ νλ‘νΌν°, λ©μλ, μλΈμ€ν¬λ¦½νΈμ μμ νκ² μ κ·Όνλ νλ‘μΈμ€μ λλ€. μ΅μ λ κ°μ΄ μ€μ κ°μ κ°μ§κ³ μμΌλ©΄ νΈμΆμ΄ μ±κ³΅νμ§λ§, nilμ΄λ©΄ μ 체 ννμμ nilμ λ°νν©λλ€.
μ΅μ λ 체μ΄λ(Optional Chaining): μ¬λ¬ μ΅μ λ κ°μ μ°κ²°ν΄μ μ κ·Όν λ, μ€κ°μ νλλΌλ nilμ΄λ©΄ μμ νκ² μ€ν¨νλ μ κ·Ό λ°©μ
π κ°μ μΈλν λμ μ΅μ λ 체μ΄λ μ¬μ©νκΈ°
μ΅μ λ 체μ΄λμ κ°μ μΈλνμ μμ ν λμμ λλ€. κ°μ μΈλν(!)μ μ΅μ λμ΄ nilμΌ κ²½μ° λ°νμ μ€λ₯λ₯Ό λ°μμν€μ§λ§, μ΅μ λ 체μ΄λ(?)μ λ¨μν nilμ λ°νν©λλ€.
κΈ°λ³Έ λ¬Έλ² λΉκ΅
// κ°μ μΈλν - nilμΌ κ²½μ° ν¬λμ λ°μ
let roomCount = john.residence!.numberOfRooms
// μ΅μ
λ 체μ΄λ - nilμΌ κ²½μ° μμ νκ² nil λ°ν
let roomCount = john.residence?.numberOfRooms
κ°λ¨ν μμ λ₯Ό ν΅ν΄ μ΄ν΄ν΄ λ΄ μλ€:
class Person {
var residence: Residence?
}
class Residence {
var numberOfRooms = 1
}
let john = Person() // residenceλ κΈ°λ³Έμ μΌλ‘ nil
// κ°μ μΈλν: λ°νμ μ€λ₯ λ°μ!
// let roomCount = john.residence!.numberOfRooms
// μ΅μ
λ 체μ΄λ: μμ νκ² nil λ°ν
if let roomCount = john.residence?.numberOfRooms {
print("Johnμ μ§μ \(roomCount)κ°μ λ°©μ΄ μμ΅λλ€.")
} else {
print("λ°©μ κ°μλ₯Ό νμΈν μ μμ΅λλ€.")
}
// μΆλ ₯: "λ°©μ κ°μλ₯Ό νμΈν μ μμ΅λλ€."
μ€μ: μ΅μ λ 체μ΄λμ ν΄λΉ νλ‘νΌν°κ° μλ μ΅μ λμ΄ μλλλΌλ κ²°κ³Όλ₯Ό νμ μ΅μ λλ‘ λνν©λλ€. μλ₯Ό λ€μ΄, numberOfRoomsλ Int νμ μ΄μ§λ§ residence?.numberOfRoomsμ κ²°κ³Όλ Int? νμ μ λλ€.
π μ΅μ λ 체μ΄λ λͺ¨λΈ μμ
λ€μν μ΅μ λ 체μ΄λ μλ리μ€λ₯Ό λ μ μ΄ν΄νκΈ° μν΄, μ¬λ¬ κ΄κ³λ₯Ό κ°μ§ ν΄λμ€ λͺ¨λΈμ μ΄ν΄λ΄ μλ€:
class Person {
var residence: Residence?
}
class Residence {
var rooms: [Room] = []
var numberOfRooms: Int {
return rooms.count
}
subscript(i: Int) -> Room {
get {
return rooms[i]
}
set {
rooms[i] = newValue
}
}
func printNumberOfRooms() {
print("λ°©μ κ°μλ \(numberOfRooms)κ° μ
λλ€")
}
var address: Address?
}
class Room {
let name: String
init(name: String) { self.name = name }
}
class Address {
var buildingName: String?
var buildingNumber: String?
var street: String?
func buildingIdentifier() -> String? {
if let buildingNumber, let street {
return "\(buildingNumber) \(street)"
} else if buildingName != nil {
return buildingName
} else {
return nil
}
}
}
μ΄ λͺ¨λΈμ μ¬μ©νμ¬ μ΅μ λ 체μ΄λμ λ€μν μΈ‘λ©΄μ μ΄ν΄λ³΄κ² μ΅λλ€.
π μ΅μ λ 체μ΄λμ ν΅ν νλ‘νΌν° μ κ·Ό
μ΅μ λ κ°μ νλ‘νΌν°μ μ κ·Όν λ μ΅μ λ 체μ΄λμ μ¬μ©ν μ μμ΅λλ€:
let john = Person()
// νλ‘νΌν° μ½κΈ°
if let roomCount = john.residence?.numberOfRooms {
print("Johnμ μ§μ \(roomCount)κ°μ λ°©μ΄ μμ΅λλ€.")
} else {
print("λ°©μ κ°μλ₯Ό νμΈν μ μμ΅λλ€.")
}
// μΆλ ₯: "λ°©μ κ°μλ₯Ό νμΈν μ μμ΅λλ€."
// νλ‘νΌν° μ€μ νκΈ°
let someAddress = Address()
someAddress.buildingNumber = "29"
someAddress.street = "Acacia Road"
john.residence?.address = someAddress // residenceκ° nilμ΄λ―λ‘ μ΄ ν λΉμ 무μλ¨
μ£Όμ: μ΅μ λ 체μ΄λμΌλ‘ νλ‘νΌν° κ°μ μ€μ νλ €κ³ ν λ, 체μΈμ μ΄λ λΆλΆμ΄λ nilμ΄λ©΄ μ 체 ννμμ νκ°λμ§ μμ΅λλ€. μ΄λ μ€λ₯Έμͺ½ ννμ(ν λΉν κ°)μ‘°μ°¨ νκ°λμ§ μμμ μλ―Έν©λλ€.
π μ΅μ λ 체μ΄λμ ν΅ν λ©μλ νΈμΆ
μ΅μ λ 체μ΄λμ ν΅ν΄ λ©μλλ νΈμΆν μ μμ΅λλ€. λ©μλκ° λ°νκ°μ΄ μλλΌλ νΈμΆμ μ±κ³΅ μ¬λΆλ₯Ό νμΈν μ μμ΅λλ€:
// λ©μλ νΈμΆ μλ
if john.residence?.printNumberOfRooms() != nil {
print("λ°©μ κ°μλ₯Ό μΆλ ₯ν μ μμ΅λλ€.")
} else {
print("λ°©μ κ°μλ₯Ό μΆλ ₯ν μ μμ΅λλ€.")
}
// μΆλ ₯: "λ°©μ κ°μλ₯Ό μΆλ ₯ν μ μμ΅λλ€."
μ°Έκ³ : λ°νκ°μ΄ μλ λ©μλ(Void λ°ν)λ μ΅μ λ 체μ΄λμ ν΅ν΄ νΈμΆνλ©΄ Void?κ° λ°νλ©λλ€. μ΄λ₯Ό ν΅ν΄ λ©μλ νΈμΆμ μ±κ³΅ μ¬λΆλ₯Ό νμΈν μ μμ΅λλ€.
π μ΅μ λ 체μ΄λμ ν΅ν μλΈμ€ν¬λ¦½νΈ μ κ·Ό
λ°°μ΄μ΄λ λμ λ리μ μλΈμ€ν¬λ¦½νΈμ μ΅μ λ 체μ΄λμ μ μ©ν μλ μμ΅λλ€:
// λ°°μ΄ μλΈμ€ν¬λ¦½νΈ μ κ·Ό
if let firstRoomName = john.residence?[0].name {
print("첫 λ²μ§Έ λ°©μ μ΄λ¦μ \(firstRoomName)μ
λλ€.")
} else {
print("첫 λ²μ§Έ λ°©μ μ΄λ¦μ νμΈν μ μμ΅λλ€.")
}
// μΆλ ₯: "첫 λ²μ§Έ λ°©μ μ΄λ¦μ νμΈν μ μμ΅λλ€."
// μ ν¨ν residence μ€μ ν λ€μ μλ
let johnsHouse = Residence()
johnsHouse.rooms.append(Room(name: "κ±°μ€"))
johnsHouse.rooms.append(Room(name: "μ£Όλ°©"))
john.residence = johnsHouse
if let firstRoomName = john.residence?[0].name {
print("첫 λ²μ§Έ λ°©μ μ΄λ¦μ \(firstRoomName)μ
λλ€.")
} else {
print("첫 λ²μ§Έ λ°©μ μ΄λ¦μ νμΈν μ μμ΅λλ€.")
}
// μΆλ ₯: "첫 λ²μ§Έ λ°©μ μ΄λ¦μ κ±°μ€μ
λλ€."
λ¬Έλ² μ°Έκ³ : μλΈμ€ν¬λ¦½νΈ μ¬μ© μ μ΅μ λ 체μ΄λμ λ¬Όμν(?)λ μλΈμ€ν¬λ¦½νΈμ λκ΄νΈ([]) μμ μμΉν©λλ€.
μ΅μ λ νμ μ μλΈμ€ν¬λ¦½νΈ μ²λ¦¬
λμ λ리μ²λΌ μλΈμ€ν¬λ¦½νΈκ° μ΄λ―Έ μ΅μ λ κ°μ λ°ννλ κ²½μ°, λκ΄νΈ λ€μ λ¬Όμνλ₯Ό λΆμ λλ€:
var testScores = ["Dave": [86, 82, 84], "Bev": [79, 94, 81]]
testScores["Dave"]?[0] = 91
testScores["Bev"]?[0] += 1
testScores["Brian"]?[0] = 72 // "Brian" ν€κ° μμΌλ―λ‘ λ¬΄μλ¨
π μ¬λ¬ μμ€μ μ²΄μΈ μ°κ²°
μ΅μ λ 체μ΄λμ μ¬λ¬ μμ€μΌλ‘ μ°κ²°ν μ μμ΅λλ€:
// μ¬λ¬ μμ€μ νλ‘νΌν° 체μ΄λ
if let johnsStreet = john.residence?.address?.street {
print("Johnμ 거리 μ΄λ¦μ \(johnsStreet)μ
λλ€.")
} else {
print("μ£Όμλ₯Ό νμΈν μ μμ΅λλ€.")
}
// μΆλ ₯: "μ£Όμλ₯Ό νμΈν μ μμ΅λλ€." (addressκ° μμ§ nilμ)
// μ£Όμ μ€μ ν λ€μ μλ
let johnsAddress = Address()
johnsAddress.buildingName = "The Larches"
johnsAddress.street = "Laurel Street"
john.residence?.address = johnsAddress
if let johnsStreet = john.residence?.address?.street {
print("Johnμ 거리 μ΄λ¦μ \(johnsStreet)μ
λλ€.")
} else {
print("μ£Όμλ₯Ό νμΈν μ μμ΅λλ€.")
}
// μΆλ ₯: "Johnμ 거리 μ΄λ¦μ Laurel Streetμ
λλ€."
μ€μ: μ¬λ¬ μμ€μ μ΅μ λ 체μ΄λμ μ¬μ©ν΄λ λ°ν κ°μ μ΅μ λ μμ€μ΄ λμ΄λμ§ μμ΅λλ€. μ¦, μλ λ°ν νμ μ΄ Intλ©΄ κ²°κ³Όλ Int?μ΄κ³ , μλ λ°ν νμ μ΄ Int?λ©΄ κ²°κ³Όλ Int?μ λλ€.
π μ΅μ λ λ°νκ°μ κ°μ§ λ©μλ 체μ΄λ
μ΅μ λ κ°μ λ°ννλ λ©μλ νΈμΆ κ²°κ³Όμλ 체μ΄λμ μ°κ²°ν μ μμ΅λλ€:
// μ΅μ
λ λ°νκ°μ κ°μ§ λ©μλ νΈμΆ
if let buildingIdentifier = john.residence?.address?.buildingIdentifier() {
print("Johnμ 건물 μλ³μλ \(buildingIdentifier)μ
λλ€.")
}
// μΆλ ₯: "Johnμ 건물 μλ³μλ The Larchesμ
λλ€."
// λ©μλ λ°νκ°μ μΆκ° 체μ΄λ
if let beginsWithThe = john.residence?.address?.buildingIdentifier()?.hasPrefix("The") {
if beginsWithThe {
print("Johnμ 건물 μλ³μλ \"The\"λ‘ μμν©λλ€.")
} else {
print("Johnμ 건물 μλ³μλ \"The\"λ‘ μμνμ§ μμ΅λλ€.")
}
}
// μΆλ ₯: "Johnμ 건물 μλ³μλ "The"λ‘ μμν©λλ€."
λ¬Έλ² μ°Έκ³ : λ©μλ λ°νκ°μ 체μ΄λμ κ³μνλ €λ©΄ λ©μλμ μκ΄νΈ() λ€μ λ¬Όμνλ₯Ό λΆμ λλ€.
π μ΅μ λ 체μ΄λ νμ© ν
1. μ΅μ λ λ°μΈλ©κ³Ό ν¨κ» μ¬μ©νκΈ°
κ°μ₯ μΌλ°μ μΈ ν¨ν΄μ μ΅μ λ 체μ΄λκ³Ό μ΅μ λ λ°μΈλ©(if let)μ ν¨κ» μ¬μ©νλ κ²μ λλ€:
if let roomCount = john.residence?.numberOfRooms {
// roomCountλ₯Ό μμ νκ² μ¬μ©ν μ μμ΅λλ€
}
2. κ°λ ꡬ문과 ν¨κ» μ¬μ©νκΈ°
μ‘°κΈ° λ°νμ΄ νμν κ²½μ° guard letκ³Ό ν¨κ» μ¬μ©ν μ μμ΅λλ€:
guard let roomCount = john.residence?.numberOfRooms else {
print("λ°©μ κ°μλ₯Ό νμΈν μ μμ΅λλ€.")
return
}
// μ¬κΈ°μλΆν°λ roomCountλ₯Ό μμ νκ² μ¬μ©ν μ μμ΅λλ€
3. μ§§μ 쑰건문μμ νμ©νκΈ°
nil λ³ν© μ°μ°μ(??)μ ν¨κ» μ¬μ©νλ©΄ κΈ°λ³Έκ°μ μ 곡ν μ μμ΅λλ€:
let roomCount = john.residence?.numberOfRooms ?? 0
4. 컬λ μ κ³Ό ν¨κ» μ¬μ©νκΈ°
λ°°μ΄, λμ λ리 λ±μ 컬λ μ μμ νΉν μ μ©ν©λλ€:
// λ°°μ΄μ 첫 λ²μ§Έ μμμ μμ νκ² μ κ·Ό
let firstRoom = john.residence?.rooms.first?.name
// λμ
λ리 κ°μ μμ νκ² μ κ·Ό
let daveScore = testScores["Dave"]?[0]
π μ 리
μ΅μ λ 체μ΄λμ Swiftμ μμ μ± μ² νμ μ 보μ¬μ£Όλ κΈ°λ₯μ λλ€. μ΄λ₯Ό ν΅ν΄:
- nil λλ¬Έμ λ°μνλ λ°νμ ν¬λμλ₯Ό λ°©μ§ν μ μμ΅λλ€
- μ°μμ μΈ μ΅μ λ κ° μ²λ¦¬λ₯Ό κ°κ²°νκ² ννν μ μμ΅λλ€
- μ½λμ λ°©μ΄μ νλ‘κ·Έλλ°μ΄ μμ°μ€λ½κ² μ΄λ£¨μ΄μ§λλ€
μ΅μ λ 체μ΄λμ ν¨κ³Όμ μΌλ‘ νμ©νλ©΄ μ½λκ° λ μμ νκ³ κ°κ²°ν΄μ§ λΏλ§ μλλΌ, κ°λ μ±λ ν₯μλ©λλ€.
'π₯ Bread Basics > Swift' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Obj-C 곡μ λ¬Έμ μ 리 - κ°μ²΄, ν΄λμ€, λ©μμ§ (0) | 2025.04.11 |
---|---|
Swift 곡μ λ¬Έμ μ 리 - λ§€ν¬λ‘ (Macros) (0) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - λμμ± (Concurrency) (0) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - μλ¬ μ²λ¦¬ (Error Handling) (0) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - μ΄κΈ°ν ν΄μ (Deinitialization) (1) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - μ΄κΈ°ν (Initialization) (0) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - μμ (Inheritance) (0) | 2025.04.11 |
Swift 곡μ λ¬Έμ μ 리 - μλΈ μ€ν¬λ¦½νΈ (Subscripts) (0) | 2025.04.11 |