forEach์์ ์์ฃผ ์ฌ์ฉํ๋ .\self ๋ฌด์จ ์๋ฏธ์ผ๊น ?
KeyPath
ํค ๊ฒฝ๋ก๋ ํ๋กํผํฐ์ ๊ฐ์ ๋ฐ๋ก ๊ฐ์ ธ์ค์ง ์๊ณ ์ด๋ค ํ๋กํผํฐ์ ์์น๋ง ์ฐธ์กฐํ๋๋ก ํ ์ ์๋ค.
๊ธ๋ก๋ ์ค๋ช ํ๊ธฐ ์ด๋ ค์ด ๊ฐ๋ ์ธ๊ฒ ๊ฐ๋ค. ๋ฐ๋ก ์์ ๋ฅผ ๋ณด์ !
Swift๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ํจ์๊ฐ ์ผ๊ธ๊ฐ์ฒด์ ์ญํ ์ ํ ์ ์๋ค.
๋๋ฌด ์ ๋ช ํ ์์ ..์ธ๋ฐ ์ด๋ ๊ฒ ๋ณ์๋ก ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๊ณ , ์ฐธ์กฐ๋ฅผ ํ ๋นํ ์ ์์ต๋๋ค !
func someFunction(paramA: Any, paramB: Any){
print("SomeFunction called...")
}
var functionReference = someFunction(paramA:paramB:)
functionReference("A","B") // someFunction called...
functionReference = anotherFunction(paramA:paramB:)
๊ทธ๋ ๋ค๋ฉด ํ๋กํผํฐ๋ ์ฐธ์กฐ ํ ์ ์๋ ?ใ ใ
ํค ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํด์ ํ๋กํผํฐ์ ์์น๋ง ์ฐธ์กฐ ๊ฐ๋ฅํฉ๋๋ค!
ํค ๊ฒฝ๋ก ํ์ ์ AnyKeyPath๋ผ๋ ํด๋์ค๋ก๋ถํฐ ํ์๋๋ค๊ณ ํด์.
๋ ๊ฐ์ง๊ฐ ์๋๋ฐ Reference๊ฐ ๋ถ์๊ฑด ์ฐธ์กฐํ์ ์, ์๋ถ์๊ฑด ๊ฐํ์ ์ ํค ๊ฒฝ๋ก๋ก ์ฝ๊ณ ์ธ ์ ์๋ ๊ฒฝ์ฐ์ ์ ์ฉ๋ฉ๋๋ค.
์ฌ์ฉ๋ฐฉ๋ฒ
ํค ๊ฒฝ๋ก๋ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋์ ๋ง์ด ๋ณธ๊ฒ ๊ฐ์ฃ ?
\ํ์
.๊ฒฝ๋ก.๊ฒฝ๋ก
์ธ์ ์ฐ๋์ ?
๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ์ฒด๊ฐ ์๋ค๊ณ ํด๋ด ์๋ค.
struct Phone {
let name: String
let color: String
}
struct PhoneInfo {
let phone: Phone
let number: String
}
let iPhone = Phone(name: "iPhone12", color: "silver")
let myPhone = PhoneInfo(phone: iPhone, number: "010-0000-0000")
let iPhoneMini = Phone(name: "iPhone12 mini", color: "gold")
let yourPhone = PhoneInfo(phone: iPhoneMini, number: "010-1111-1111")
"๋๋ phone.name์ ์ฌ์ฉํ ๊ฑด๋ฐ ์ง๊ธ๋ง๊ณ ๋์ค์! ๊ทธ๋ฆฌ๊ณ ์ด๋ค ์ธ์คํด์ค์ phone.name์ ์ฌ์ฉํ ์ง ๋ชฐ๋ผ ~ "
์ด๋ฐ ๊ฒฝ์ฐ์ ์๋์ ์ ์ธํ nameKeyPath๋ฅผ ๋งค์ฐ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค!
let phoneNameKeyPath = \Phone.name //KeyPath<Phone, String>
let phoneColorKeyPath = \Phone.color //KeyPath<Phone, String>
Root๋ ์ด๋ฆ ๊ทธ๋๋ก ์ฐธ์กฐํ๋ ํ์ ์ Root ์ ๋๋ค. Value๋ value๊ฐ ๊ฐ์ง๋ ํ์ ์ด๊ฒ ์ฃ ?
๋จ์ํ String ๊ฐ์ด ์๋๋ผ๋ ์ ์ ์ฃผ์ํ์ธ์โ๏ธ
์ด์ iPhone์ ์ด๋ฆ๊ณผ iPhoneMini์ ์ด๋ฆ์ phoneNameKeyPath๋ก ์ฝ์ด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
(์ฌ์ฉ ํ ๋๋ ์๋ธ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํฉ๋๋ค.)
iPhone[keyPath: phoneNameKeyPath] //"iPhone12"
iPhoneMini[keyPath: phoneNameKeyPath] //"iPhone12 mini"
PhoneInfo์ ์๋ phone ํ๋กํผํฐ์ color์ ์ฐธ์กฐํ๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ ์ธํ ์ ์์ต๋๋ค.
let colorKeyPath = \PhoneInfo.phone.color //KeyPath<PhoneInfo, String>
๋๋
let keyPath = \PhoneInfo.phone
let colorkeyPath = keyPath.appending(path: \.color)
๋์ ํฐ, ๋์ ํฐ์ ์ปฌ๋ฌ๊ฐ ์๊ณ ์ถ๋ค๋ฉด ?
myPhone[keyPath: colorkeyPath] //"silver"
yourPhone[keyPath: colorkeyPath] //"gold"
full code
\.self
ํค ๊ฒฝ๋ก๋ฅผ ์ตํ๊ณ ๋๋ ์์ฃผ์ฐ๋ \.self ๊ฐ ํค ๊ฒฝ๋ก๋ผ๋ ๊ฒ์ ์ ์ ์๊ฒ ์ฃ ?
์ฐ๋ฆฌ swift๊ฐ ํ์ ์ ์ถ๋ก ํ ์ ์๋ ๊ฒฝ์ฐ์๋ ์๋ตํ๊ณ .something ์ด๋ ๊ฒ ์ ๋๊ฑฐ ์๊ณ ์์์์ ?
\.self๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. self๋ ์๊ธฐ ์์ ์ ํํํ๋ฏ๋ก \.self๋ ์ธ์คํด์ค ๊ทธ ์์ฒด๋ฅผ ํํํ๋ ํค ๊ฒฝ๋ก ์ ๋๋ค.
map ์์ ํค๊ฒฝ๋ก ์ฌ์ฉํ๊ธฐ
์๋ง๋ ์ง๊ธ๊น์ง๋ map, filter๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ํํ ํด๋ก์ ๋ฅผ ๋ง์ด ์ฌ์ฉํด ์์๊ฑฐ์์.
(SomeType) -> Value ํ์ ์ ํด๋ก์ ๋ฅผ ํค ๊ฒฝ๋ก ํํ์ผ๋ก ๋์ฒดํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค!
๋น์ฐํ map ์ธ์๋ filter, compactMap ๋ฑ์์ ์ฌ์ฉํ ์ ์๊ฒ ์ฃ ?!
let iPhone = Phone(name: "iPhone12", color: "silver")
let mini = Phone(name: "iPhone12 mini", color: "gold")
let galaxy = Phone(name: "Galaxy S21", color: "pink")
let zflip = Phone(name: "zfilp 4", color: "vanilla")
let phone = [iPhone, mini, galaxy, zflip]
//๊ธฐ์กด
let phoneNames = phone.map{$0.name}
//ํค๊ฒฝ๋ก ์ฌ์ฉ
let phoneNames = phone.map(\.name)
์ ํ์ ํ๋ ์์ํฌ๋ค์ด ํค ๊ฒฝ๋ก๋ฅผ ๋ง์ด ํ์ฉํ๊ณ ์๋ค๊ณ ํ๋ ์ ์์๋์๊ธธ ๋ฐ๋ผ์ ๐
์ ํ์ฉํ๋ฉด ํ์ ๊ฐ ์์กด์ฑ์ ๋ฎ์ถ๋๋ฐ ๋์์ด ๋๋ค๋๋ฐ... ๋ ๊ณต๋ถํด๋ด์ผ๊ฒ ๋ค์ :(
'๐ Programming > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swfit] ํ๋กํผํฐ ๊ฐ์์ / property observer (willSet & didSet) (0) | 2022.05.26 |
---|---|
[Swift] ์ต์ ๋ ์ฒด์ด๋ (0) | 2022.02.17 |
[Swift] class ์์(Inheritance) (0) | 2022.02.03 |
[Swift] property(ํ๋กํผํฐ) (0) | 2022.01.24 |
[Swift] ํด๋ก์ (Closure)์ ๋ชจ๋ ๊ฒ (0) | 2022.01.21 |