์๋
ํ์ธ์, ๊ฐ์์
๋๋ค! ์ค๋์ ์ต์
๋ ์ฒด์ด๋์ ๋ํด์ ์์๋ด
์๋ค.
๋ณธ ํฌ์คํ
์ ํจ์คํธ์บ ํผ์ค 30๊ฐ ํ๋ก์ ํธ๋ก ๋ฐฐ์ฐ๋ iOS์ฑ ๊ฐ๋ฐ ๊ฐ์๋ฅผ ๋ค์ผ๋ฉฐ ์์ฑํ ํฌ์คํ
์
๋๋ค :)
์ต์ ๋ ์ฒด์ด๋(Optional Chaning) ์ด๋?
chaining์ด๋ผ๋ ๊ฒ์ ์ฐ์๋ผ๋ ๋ป์ผ๋ก, ์ต์ ๋์ ์ฐ์์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์๋ฏธํ๋ค. (์ต์ ๋ ๊ฐ๋ ) ๊ธฐ๋ณธ์ ์ธ ํํ๋ ์๋์ ๊ฐ๋ค.
person.contacts?.address
person?.contacts?.address
์ด์ ๊ฐ๋ฐ์ ํ๊ฒ ๋๋ฉด, ์ด๋ฌํ ํํ๋ฅผ ๋ง์ด ๋ณด๊ฒ ๋ ํ ๋ฐ ํ์คํ๊ฒ ์ดํดํ๊ณ ๋์ด๊ฐ๋ณด๋๋ก ํ์ :)
์จ์ (.) ์ ํตํด ๋ด๋ถ ํ๋กํผํฐ๋ ๋ฉ์๋์ ์ฐ์์ ์ผ๋ก ์ ๊ทผํ๊ฒ ๋ ๋, ์ต์ ๋ ๊ฐ์ด ํ๋๋ผ๋ ๊ปด ์๋ค๋ฉด, ์ต์ ๋ ์ฒด์ด๋์ด๋ค. ์ด๊ฒ์ด ๋ฌด์จ๋ง์ด๋,
person.contact.address
์ ์ฝ๋์ฒ๋ผ ์ต์ ๋์ด ํ๋๋ผ๋ ๊ปด์์ง ์๊ธฐ ๋๋ฌธ์, ์ ์ฝ๋์ฒ๋ผ ๋์ด์๋ค๋ฉด ์ ์ธ๊ฐ๋ ์ต์ ๋์ด ์๋๋ ๋ง์ด๋ค.
์ ๊ทธ๋ผ, ์ด์ ์ต์ ๋ ์ฒด์ด๋์ ๋ํด์ ์์ ๋ฅผ ์ดํด๋ณด์. (์๋ค๋ ํฐ์คํ ๋ฆฌ ๋ธ๋ก๊ทธ ์ฐธ๊ณ ! ์ ๋ฆฌ ์ ๋ง ์๋์ด์์ด์. ํ๋ฒ์ฉ ๋ณด์ธ์!)
โถ ์์ ๋ก ์ดํด๋ณด๋ ์ต์ ๋ ์ฒด์ด๋
๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ์ฒด๊ฐ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ต์ ๋ person ํ์ ์ธ potato๋ผ๋ ๋ณ์๋ฅผ ์ ์ธํด๋ณด์.
struct Contacts {
var email: String
var address: [String: Stirng]
}
struct Person {
var name: String
var contacts: Contacts
init(name: String, email: String, address: String) {
self.name = name
contacts = Contacts(email: email, address: ["home": address])
}
}
var potato: Person? = Person(name: "potatoPotato", email:"potato@1234", address: "Seoul")
์ด๋ ๊ฒ potato๋ผ๋ ๋ณ์๋ฅผ ์ ์ธํ๋ค. ๊ทธ๋ฌ๊ณ ์ด์ potato.contacts.email์ ์ ๊ทผํด๋ณด์.
๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฌ๋ค. ๊ทธ ์ด์ ๋, potato๊ฐ ์ต์ ๋ ํ์ ์ด๊ธฐ ๋๋ฌธ์ ? ๋ฅผ ์จ์ฃผ์ด์ผํ๋ค. ใ ใ ๊ทผ๋ฐ ์ฌ์ค xcode์์ ์๋์ผ๋ก ? ๋ฅผ ์จ์ฃผ๋๋ฐ ์ผ๋ถ๋ฌ ์ด๋ป๊ฒ ์ค๋ฅ๊ฐ ๋๋์ง ์ง์๋ณด์๋ค ใ ใ
์ด๋ ๊ฒ ์ ๊ทผํ ์ ์๋ค. ๋ง์ฝ์ potato?.contacts.email์ด nil ๊ฐ์ด๋ฉด, nil์ด ์ถ๋ ฅ๋๋ค. (potato, contacts, email ์ ์ค ํ๋๋ผ๋ nil์ธ ๊ฒฝ์ฐ๋ฉด, ๋ฌด์กฐ๊ฑด nil์ ์ถ๋ ฅํ๋ค.)
โถ ์ต์ ๋ ์ฒด์ด๋์ ํน์ง์ ์์๋ณด์.
ํน์ง1. ์ต์ ๋ ์ฒด์ด๋์ ๊ฒฐ๊ณผ๊ฐ์ ํ์ ์ ๋ง์ง๋ง ํํ์์ ์ต์ ๋ ํ์ ์ด๋ค.
์์ ์ฌ์ฉํ๋ ๋ณ์๋ฅผ ๊ฐ์ง๊ณ type์ ์ดํด๋ณด์.
์ต์ ๋ ์ฒด์ด๋๋ ๋ณ์ e๋ ๋ง์ง๋ง์ ์๋ email์ ํ์ ์ ์ต์ ๋๋ก ๊ฐ์ ธ๊ฐ๋ค. ์ฆ ๊ฐ๋จํ๊ฒ ํ๋ก ์ ๋ฆฌํด๋ณด๋ฉด,
ํํ์ | ํ์ |
e | Optional<String> |
potato | Person |
contacts | Contacts |
String |
์ฆ ์ต์ ๋ ์ฒด์ด๋์ผ๋ก ์ ์ธ๋ ์์ e๋ ๋ง์ง๋ง email์ ํ์ ์ธ string ์ ์ต์ ๋๋ก ๊ฐ์ธ์ง ํํ๋ฅผ ๊ฐ์ ธ๊ฐ๋ค.
ํน์ง2. ์ต์ ๋ ์ฒด์ด๋์ ๋ง์ง๋ง ํํ์์ ์ต์ ๋์ด๋๋ผ๋ ? ๋ฅผ ์๋ตํ๋ค.
์ด๋ฌํ ๊ท์น์ ํ์ธํ๊ธฐ ์ํด ๊ตฌ์กฐ์ฒด2 ๋ฅผ ๋ง๋ค์๋ค. email์ ์ต์ ๋ ํ์ ์ผ๋ก ๋ฐ๊พธ์ด ์ฃผ๊ณ , e2๋ฅผ ์ ์ธํด๋ณด์๋๋ฐ, ๋ง์ง๋ง์๋ ์ต์ ๋ ํ์ ์ด๊ธฐ ๋๋ฌธ์ ๋น์ฐํ ? ๋ฅผ ๋ถ์ฌ์ผํ์ง์๋๊ฐ? ํ์ง๋ง, ์ค๋ฅ๊ฐ ๋๋ค. ๋ง์ง๋ง์ ๋ฌด์กฐ๊ฑด ?๋ฅผ ์๋ตํด์ฃผ์.
ํน์ง3. ์ต์ ๋ ์ฒด์ด๋์ ํํ์ ์ค ํ๋๋ผ๋ nil๊ฐ์ ๊ฐ์ง๋ค๋ฉด, ์ด์ด์ง๋ ํํ์์ ํ๊ฐํ์ง ์๊ณ ๋ฐ๋ก nil์ ๋ฐํํ๋ค.
potato๋ฅผ nil๊ฐ์ผ๋ก ์ค์ ํ๊ณ , e3 ์์๋ฅผ ์ ์ธํ๋ค. ๋งจ์์์๋ potato๊ฐ nil์ด๊ธฐ ๋๋ฌธ์, ๋ค์ ์๋ ํํ์์ ํ๊ฐํ์ง ์๊ณ ๋ฐ๋ก ๊ทธ๋ฅ nil์ ๋ฐํํ๋ค.
โถ ํจ์์ ์ฌ์ฉ๋๋ ์ต์ ๋ ์ฒด์ด๋
์ต์ ๋ ์ฒด์ด๋์์ ํจ์๊ฐ ํจ๊ป ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ๋ฅผ ์์๋ณด์.
1) function()?
์ด ๋ด์ฉ์ ์ค๋ช ํ๊ธฐ ์ํด ์์์ ๋ง๋ค์ด๋จ๋ Person๊ตฌ์กฐ์ฒด์ ์๋ก์ด ํจ์๋ฅผ ์ถ๊ฐํ๋ค.
struct Person2 {
var name: String
var contacts: Contacts
init(name: String, email: String, address: String) {
self.name = name
contacts = Contacts(email: email, address: ["home": address])
}
func getContacts() -> Contacts? {
return contacts
}
}
์ด Person๊ตฌ์กฐ์ฒด์ getContacts๋ผ๋ ํจ์์ ๋ฆฌํด๊ฐ์ผ๋ก ์ป์ contacts์ email๊ฐ์ ์ ๊ทผํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
๋ค์๊ณผ ๊ฐ์ด ์ฐ๋ฉด๋๋ค.
potato?.getContacts()?.email
๊ทธ๋ผ ๊ตณ์ด ํจ์ ๋ค์ ์ ? ๋ฅผ ๋ถ์๋๊ฐ? ๋ฐ๋ก , ํด๋น ํจ์์์ ๋ฆฌํด๊ฐ์ผ๋ก ๋ฐ๋ Contacts๊ฐ ์ต์ ๋์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋๊น!! ํจ์์ ๋ฆฌํด๊ฐ์ด ์ต์ ๋์ด๋ฉด ?๋ฅผ ํจ์ ๋ค์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
์ ๋ฆฌํ์๋ฉด, ํจ์() ๋ค์ ? ๊ฐ ๋ถ๋ ๊ฒฝ์ฐ๋ ํจ์์ ๋ฆฌํด ๊ฐ์ ์์ฑ์ ์ ๊ทผํ ๋ ์ด๋ ๊ฒ ์ฌ์ฉํ๋ค.
2) function?()
๋ฐ๋๋ก ?() ์ ํํ๋ก ์ฌ์ฉํ ์๋ ์๋ค. ์ด ๊ฒฝ์ฐ๋, ํจ์์ ๋ฆฌํด๊ฐ์ด ์ต์ ๋์ด ์๋๋!! ์ด์ฒ๋ผ ์์ฑํ๋ค.
func getContacts() -> Contacts {
return contacts
}
๋ง์ฝ ์ ์ฝ๋์ฒ๋ผ, Person ๊ตฌ์กฐ์ฒด ์์ ์๋ getContatcts() ํจ์์ ๋ฐํ๊ฐ์ด Contacts (non-optional) ์ด๋ฉฐ, getContacts ํจ์๋ฅผ ๋ด์ ์์๊ฐ optional type ์ธ ๊ฒฝ์ฐ์ ์ด๋ ๊ฒ ์ฌ์ฉํ๋ค. ๋ค์ ์ฝ๋๋ฅผ ๋ณด์.
let function = potato?.getContacts
// ์ด๋ ๊ฒ ์ต์
๋ ํ์
์ด ์๋ ํจ์๋ฅผ, ์์์ ์ ์ธํ๋๋ฐ, ์ด ์์๋ ์ต์
๋์ผ๋!!
function()?.email
// ์ด๋ ๊ฒ ์ต์
๋ ์ฒด์ด๋ํจ.
3) function?()?
์ด๊ฑด ๋ ๋ญ๋,, ์์ชฝ์ ? ๊ฐ ์๋ ๊ฒฝ์ฐ๋ ์๋ค. ์ด๊ฒฝ์ฐ๋ ์ธ์ ์ฌ์ฉํ๋๊ฐ? ๋ฐ๋ก ํจ์ ์์ฒด๋ ์ต์ ๋์ด๊ณ , ๋ฆฌํด๊ฐ๋ ์ต์ ๋์ผ๋ ์ฌ์ฉํ๋ค. ๋ค์ ์ฒ์์ผ๋ก ๋์๊ฐ์ Person๊ตฌ์กฐ์ฒด์ ์๋ func์ ๋ฐํ๊ฐ์ด ์ต์ ๋ ํ์ ์ด๋ผ๊ณ ์น์.
func getContacts() -> Contacts? {
return contacts
}
๊ทธ๋ฆฌ๊ณ getContactsํจ์๋ฅผ ๋ด์ ์์๋, ์ต์ ๋์ด๋ผ๊ณ ํ์.
let function = potato?.getContacts
์ด๋ด๋, email๊ฐ์ ์ ๊ทผํ๊ธฐ ์ํด์๋ ์๋์ ๊ฐ์ด ์ต์ ๋ ์ฒด์ด๋์ ํ๋ค.
function?()?.email
์ ๋ฆฌํ์๋ฉด
- ?() function์ด๋ ํจ์๊ฐ ๋จผ์ optional์ธ์ง ์๋์ง ํ์ธํด์ฃผ๊ณ
- ()? function ํจ์๊ฐ optional์ด ์๋๋ผ๋ฉด ๋ฆฌํด๊ฐ์ด ์ต์ ๋์ธ์ง ์๋์ง ๋ ์ฒดํฌํด์ค๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋์ ?()?
โถ ๋์ ๋๋ฆฌ์ ํจ๊ป ์ฌ์ฉ๋๋ ์ต์ ๋ ์ฒด์ด๋
ํจ์์ ๋น์ทํ ๊ฐ๋ ์ผ๋ก ๋์ ๋๋ฆฌ์ ๋ผ์์ ์ฌ์ฉ๋๊ธฐ๋ ํ๋ค. .. ๊ฐ๋จํ๊ฒ ์ดํด๋ณด์.
1. []?
์๋ ์ฝ๋์ ๊ฐ์ด dic์ด ์กด์ฌํ๋ค. ์ด dic์์ name์ด๋ผ๋ key๊ฐ์ ์ ๊ทผํ์ฌ, ๊ทธ ํค๊ฐ์ value๋ฅผ countํด๋ณด์. ๊ทธ๋ด๋ ๋ฐ๋ก []?๋ฅผ ์ฌ์ฉํ๋ค.
let dic: [String: String] = ["name": "contact"]
dic["name"]?.count
์ ? ์ต์ ๋ ํ์ ๋ ์๋๋ฐ ์์์์??? ๋ฐ๋ก, dic์์ nameํค๊ฐ์ ๊ฐ์ง๋ value๊ฐ ์์ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.. ์ ๋ ์นด!!!!! ๋ฐ๋ผ์ ๋ฌด์กฐ๊ฑด์ ์ผ๋ก optional type์ด ๋ฆฌํด๋๋ค. ์ ๋ฆฌํ์๋ฉด, ๋์ ๋๋ฆฌ์ key๊ฐ์ผ๋ก ์ป์ value์ ๊ฐ์ ์์์ ์ ๊ทผํ ๋๋ []?๋ฅผ ์ฌ์ฉํ๋ค.
2. ?[]?
ํจ์์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด๊ฑด, ๋์ ๋๋ฆฌ ํ์ ์์ฒด๊ฐ ์ต์ ๋์ธ๊ฒฝ์ฐ์ด๋ค. ํจ์์์๋ ํจ์์์ฒด๊ฐ ์ต์ ๋์ด๊ณ ๋ฆฌํด๊ฐ๋ ์ต์ ๋์ด๋ฉด (์์ชฝ์ด์ต์ ๋์ด๋ฉด!!) ?๋ฅผ ๋๊ฐ ๋ถ์ฌ์ฃผ์ง์์๋๊ฐ? ๋ฐ๋ก ๋์ ๋๋ฆฌ๋ ๋ง์ฐฌ๊ฐ์ง๋ค. ๋์ ๋๋ฆฌ ์์ฒด๋ ์ต์ ๋์ด๊ณ , ๋ฐ๋ก ์ ์ ๋ฐฐ์ ๋ฏ์ด ๋์ ๋๋ฆฌ์์ key๊ฐ์ ์กด์ฌํ๋ value์ ์ ๊ทผํ๋ ค๋ฉด ๋ ๋ฆฌํด๊ฐ์ด ๋ฌด์กฐ๊ฑด ์ต์ ๋์ด๋๊น,, ๊ทธ๋์ ?[] ๋ ์กด์ฌํ์ง ์๋ ใด๊ฒ์ด๊ณ ,, ๊ทธ๋์ ?[]? ๋ง ์กด์ฌํ๋๊ฒ์ด๊ณ ~~
์ด๋ ๊ฒ ๊ธธ๊ณ ๊ธด ์ต์ ๋ ์ฒด์ด๋์๋ํด์ ์์๋ณด์์ต๋๋ค. ํด๋น ํฌ์คํ ์ ์์ ํ!! ๊ฐ๋ฐ์ ์๋ค๋์ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํ์ฌ ์์ฑํ์ต๋๋ค. ์๋ค๋ ๋ธ๋ก๊ทธ ์ ๋ฆฌ ์ง์ง ์๋์ด ์์ผ๋, ๊ณต๋ถํ๋ฉด์ ๋ง์ ๋์์ด ๋ ๊ฒ๊ฐ์ต๋๋ค.
'Swift > Swift BASIC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] ๊ธฐ์ด ๋ฌธ๋ฒ - ํด๋ก์ ์ ๋ํ ๊ฐ๋จํ ๊ฐ๋ (closure) (0) | 2022.01.23 |
---|---|
[Swift] ๊ธฐ์ด ๋ฌธ๋ฒ - ์์ธ์ฒ๋ฆฌ (throws, do-catch, try) (0) | 2022.01.23 |
[Swift] ๊ธฐ์ด ๋ฌธ๋ฒ - ์ด๊ฑฐํ (enum) (0) | 2022.01.20 |
[Swift] ๊ธฐ์ด ๋ฌธ๋ฒ - extension(ํ์ฅ) (0) | 2022.01.20 |
[Swift] ๊ธฐ์ด ๋ฌธ๋ฒ - ํ๋กํ ์ฝ (protocol) (0) | 2022.01.19 |