์ต์ ๋ ์ฒด์ด๋
์ต์ ๋์ ์ํด ์๋ nil ์ผ์ง๋ ๋ชจ๋ฅด๋ ํ๋กํผํฐ, ๋ฉ์๋, ์๋ธ์คํฌ๋ฆฝ์ ๋ฑ์ ๊ฐ์ ธ์ค๊ฑฐ๋ ํธ์ถํ ๋ ์ฌ์ฉํ ์ ์๋ ์ผ๋ จ์ ๊ณผ์ . ์ฆ, ์ต์ ๋์ ๋ฐ๋ณต์ฌ์ฉํ์ฌ ์ต์ ๋์ด ์์ ๊ฑฐ ์ฒด์ธ์ฒ๋ผ ์๋ก ๊ผฌ๋ฆฌ๋ฅผ ๋ฌผ๊ณ ์๋ ๋ชจ์์ด๊ธฐ ๋๋ฌธ์ ์ต์ ๋ ์ฒด์ด๋์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์์ ๊ฑฐ ์ฒด์ธ์์ ํ ์นธ์ด๋ผ๋ ์๊ฑฐ๋ ๊ณ ์ฅ ๋๋ฉด ์ฒด์ธ ์ ์ฒด๊ฐ ๋์ํ์ง ์๋ฏ์ด ์ค์ฒฉ๋ ์ต์ ๋ ์ค ํ๋๋ผ๋ ๊ฐ์ด ์กด์ฌํ์ง ์๋๋ค๋ฉด ๊ฒฐ๊ณผ์ ์ผ๋ก nil ๋ฐํ
์ต์ ๋ ์ฒด์ด๋์ ํ๋กํผํฐ๋ ๋ฉ์๋ ๋๋ ์๋ธ์คํฌ๋ฆฝํธ๋ฅผ ํธ์ถํ๊ณ ์ถ์ ์ต์ ๋ ๋ณ์๋ ์์ ๋ค์ ๋ฌผ์ํ(?)๋ฅผ ๋ถ์ฌ ํํํ๋ค.
์ต์ ๋์ด nil์ด ์๋๋ผ๋ฉด ์ ์์ ์ผ๋ก ํธ์ถ๋ ๊ฒ์ด๊ณ , nil์ด๋ผ๋ฉด ๊ฒฐ๊ด๊ฐ์ผ๋ก nil์ ๋ฐํํ ๊ฒ์ด๋ค.
! ( ๋๋ํ )
๋ฌผ์ํ ๋์ ์ ๋๋ํ๋ฅผ ์ฌ์ฉํ ์๋์๋๋ฐ, ์ด๋ ์ต์ ๋์์ ๊ฐ์ ๊ฐ์ ์ถ์ถํ๋ ํจ๊ณผ๊ฐ ์๋ค. ๋ฌผ์ํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ๊ฐ์ ๊ฐ์ ์ถ์ถ ํ๊ธฐ ๋๋ฌธ์ ์ต์ ๋์ ๊ฐ์ด ์๋ค๋ฉด ๋ฐํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ๋ ๋ค๋ฅธ ์ ์ ์ต์ ๋์์ ๊ฐ์ ๊ฐ์ ์ถ์ถํด ๋ฐํํ๊ธฐ ๋๋ฌธ์ ๋ฐํ ๊ฐ์ด ์ต์ ๋์ด ์๋๋ผ๋ ์ ์ด๋ค. ํ์ง๋ง ์ ๋ง 100% nil์ด ์๋๋ผ๋ ํ์ ์ ํ๋๋ผ๋ ์ฌ์ฉ์ ์ง์ํ๋๊ฒ ์ข๋ค.
์ต์ ๋ ์ฒด์ด๋์ ์์๋ณด๊ธฐ ์ํ ์ฌ๋์ ์ฃผ์ ์ ๋ณด ํํ ์ค๊ณ
Class Room{ // ํธ์ค
var number: Int // ํธ์ค ๋ฒํธ
init(number: Int) {
self.number = number
}
}
class Building { // ๊ฑด๋ฌผ
var name: String // ๊ฑด๋ฌผ ์ด๋ฆ
var room: Room? // ํธ์ค ์ ๋ณด
init(name: String){
self.name = name
}
}
struct Address { // ์ฃผ์
var province: String // ๊ด์ญ์/๋
var city: String // ์/๊ตฐ/๊ตฌ
var street: String // ๋๋ก๋ช
var building: Building? // ๊ฑด๋ฌผ
var detailAddress: String? // ๊ฑด๋ฌผ ์ธ ์์ธ์ฃผ์
}
class Person{ // ์ฌ๋
var name: String // ์ด๋ฆ
var address: Address? // ์ฃผ์
init(name: String){
self.name = name
}
}
( Person ํด๋์ค๋ ์ด๋ฆ์ด ์๊ณ ์ฃผ์๋ ์ต์ ๋๋ก ๊ฐ๋๋ค )
// yagom ์ธ์คํด์ค ์์ฑ
let yagom : Person = Person(name: "yagom")
---> yagom์ด ์ฌ๋ ํธ์ค ๋ฒํธ๋ฅผ ์๊ณ ์ถ๋ค.
let yagomRoomViaOptionalChaining: Int? = yagom.address?.building.?.room?.number // nil
let yagomRoomViaOptionalChaining: Int? = yagom.address!.building.!.room!.number // ์ค๋ฅ
yagom ์๋ ์์ง ์ฃผ์, ๊ฑด๋ฌผ, ํธ์ค ์ ๋ณด๊ฐ ์๋ค. ์ต์ ๋ ์ฒด์ด๋์ ์ฌ์ฉํ๋ฉด yaom์ address ํ๋กํผํฐ๊ฐ nil์ด๋ฏ๋ก ์ต์ ๋ ์ฒด์ด๋ ๋์ค nil์ด ๋ฐํ๋๋ค. ๊ทธ๋ฌ๋ ! ๋ก ๊ฐ์ ์ถ์ถ์ ์๋ํ์๋ nil์ธ address ํ๋กํผํฐ์ ์ ๊ทผํ๋ ค ํ ๋ ๋ฐํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
์ต์ ๋ ๋ฐ์ธ๋ฉ๊ณผ ์ต์ ๋ ์ฒด์ด๋ ๋น๊ต
์ต์ ๋ ๋ฐ์ธ๋ฉ ์ฌ์ฉ
let yagom: Person = Person(name: "yagom")
var roomNumber: Int? = nil
if let yagomAddress: Address = yagom.address{
if let yagomBuilding: Building = yagomAddress.building {
if let yagomRoom: Room = yagomBuilding.room {
roomNumber = yagomRoom.number
}
}
}
if let number: Int = roomNumber{
print(number)
} else {
print("Can not find room number")
}
์ต์ ๋ ์ฒด์ด๋์ ์ฌ์ฉ
let yagom: Person = Person(name: "yagom")
if let roomNumber: Int = yagom.address?.building?.room?.number {
print(roomNumber)
} else {
print("Can not find room number")
}
์ต์ ๋ ์ฒด์ด๋์ ๊ฒฐ๊ด๊ฐ์ ์ต์ ๋ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์ต์ ๋ ๋ฐ์ธ๋ฉ๊ณผ ๊ฒฐํฉํ ์ ์๋ค.
๋น ๋ฅธ ์ข ๋ฃ Guard
- if ๊ตฌ๋ฌธ : '~๋ฉด ํด๋ผ'
- guard ๊ตฌ๋ฌธ : '~ ์๋๋ฉด ๋๋ด๋ผ' --> ๋น ๋ฅธ ์ข ๋ฃ !
- ์กฐ๊ฑด์ด ๋ง์ง ์์ผ๋ฉด ์ข ๋ฃ์์ผ์ผ ํ๋๋ก ๋ฌธ๋ฒ ์์ฑ ( return / throw )
if ๊ตฌ๋ฌธ๊ณผ ์ ์ฌํ๊ฒ Bool ํ์ ์ ๊ฐ์ผ๋ก ๋์ํ๋ค.
guard๋ค์ ๋ฐ๋ผ๋ถ๋ ์ฝ๋์ ์คํ ๊ฒฐ๊ณผ๊ฐ true์ผ๋ ์ฝ๋๊ฐ ๊ณ์ ์คํ๋๋ค.
if ๊ตฌ๋ฌธ๊ณผ๋ ๋ค๋ฅด๊ฒ guard ๊ตฌ๋ฌธ์ ํญ์ else ๊ตฌ๋ฌธ์ด ๋ค์ ๋ฐ๋ผ์์ผ ํ๋ค.
๊ธฐ๋ณธ์ ์ธ ํํ
guard Boolํ์ ๊ฐ else {
์์ธ์ฌํญ ์คํ๋ฌธ
์ ์ด๋ฌธ ์ ํ ๋ช ๋ น์ด
}
๊ฐ์ ์ญํ ์ ํ๋ if ๊ตฌ๋ฌธ๊ณผ guard ๊ตฌ๋ฌธ
// if ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ฝ๋
for i in 0...3 {
if i == 2 {
print(i)
} else {
continue
}
}
// guard ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ฝ๋
for i in 0...3 {
guard i == 2 else {
continue
}
print(i)
}
์ฌ์ฉ ์ด์ : ๊ฐ๋ ์ฑ์ด ์ข์ ์ฝ๋ ์์ฑ์ด ๊ฐ๋ฅํ๋ค.
ํ๊ณ์
- ํจ์ / ๋ฉ์๋ / ๋ฐ๋ณต๋ฌธ ์์์๋ง ์ฌ์ฉํ๋ค.
- ์์ ์ ๊ฐ์ธ๋ ์ฝ๋ ๋ธ๋ก. ์ฆ, return, break, continue, throw ๋ฑ์ ์ ์ด๋ฌธ ์ ํ ๋ช ๋ น์ด๋ฅผ ์ธ ์ ์๋ ์ํฉ์ด๋ผ๋ฉด ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅ
'๐ iOS > ๊ธฐ์ด๋ฌธ๋ฒ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift ๊ธฐ์ด] ๋ชจ๋๋ (0) | 2023.01.31 |
---|---|
[Swift ๊ธฐ์ด] ๋งต, ํํฐ, ๋ฆฌ๋์ค (0) | 2023.01.27 |
[Swift ๊ธฐ์ด] ํด๋ก์ (0) | 2023.01.19 |
[Swift ๊ธฐ์ด] ์ ๊ทผ์ ์ด (0) | 2023.01.18 |
[Swift ๊ธฐ์ด] ์ธ์คํด์ค ์์ฑ ๋ฐ ์๋ฉธ (0) | 2023.01.15 |