-
[Swift] TuplesSwift 2022. 2. 15. 08:32
(๋ชจ๋ ์ฝ๋๋ Playground์์ ์์ฑ๋์์ต๋๋ค.)
Swift์๋ ์ฌ์ค 2๊ฐ์ง์ ํ์ ์ด ์กด์ฌํ๋ค.
๋ฐ๋ก Named Type๊ณผ Compound Type์ธ๋ฐ,
Named Type์ ํ์ ์ด ์ ์๋ ๋ ํน์ ์ด๋ฆ์ ์ง์ ํ ์ ์๋, ๋ง ๊ทธ๋๋ก ์ด๋ฆ์ด ์๋ ํ์ ์ ๋งํ๋ค.
์๋ฅผ ๋ค์ด์ ๋ด๊ฐ MyClass๋ผ๋ ํด๋์ค๋ฅผ ๋ง๋ค์๋ค๊ณ ํ์. ๊ทธ๋ฌ๋ฉด "MyClass" ๋ผ๋ ์ด๋ฆ์ ๊ฐ๋ ํ์ ์ด ๋ง๋ค์ด์ง๋ ๊ฒ์ด๋ค.
Named Type์๋ Class (ํด๋์ค), Structure (๊ตฌ์กฐ์ฒด), Enumeration (์ด๊ฑฐํ), Protocol (ํ๋กํ ์ฝ)์ด ํฌํจ๋๋ค.
์ฐ๋ฆฌ๊ฐ ํํ ์๋ Int, Double, String, Character ๊ณผ ๊ฐ์ ์๋ฃํ๋ค๋ ๊ตฌ์กฐ์ฒด๋ก ์ด๋ฃจ์ด์ ธ ์๊ธฐ ๋๋ฌธ์ Named Type์ด๋ค.
Compound Type์ Swift ์์ฒด์์ ์ ์๋๋ ๊ฒ์ผ๋ก, ์ด๋ฆ์ด ์๋ ํ์ ์ ๋งํ๋ค.
Compound Type์๋ 2๊ฐ์ง๊ฐ ์๋๋ฐ, ๋ฐ๋ก Function Type๊ณผ Tuple Type์ด๋ค.
์ ์ 2๊ฐ๋ฅผ ๋ฐ์์ ๋ ๊ฐ์ ๋ํ ํ์ ๊ฒฐ๊ณผ ๊ฐ์ ์ ์๋ก ๋ฆฌํดํ๋ ํจ์๋ฅผ ๋ง๋ค์๋ค๊ณ ํ์.
๊ทธ๋ฌ๋ฉด ์ด ํจ์์ ํ์ ์ ๋ฌด์์ผ๊น?
๋ฐ๋ก (Int, Int) -> Int ํ์ ์ด๋ค.
์ด๋ ๊ฒ Function๊ณผ Tuple์ Compound Type์ธ๋ฐ, ์ด๋ฒ ์๊ฐ์๋ Tuple์ ๋ํด ์์๋ณด๋๋ก ํ์.
ํํ์ ์๋์ ๊ฐ์ด ( ) ์์ ,๋ฅผ ์ด์ฉํด์ ๊ฐ์ ๋์ดํ์ฌ ์ ์ฅํ๋ฉด ๋๋ค.
(expression1, expression2, ..)ํํ ๋ด์๋ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ์ ์ฅํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์์ ๋งํ๋ฏ์ด Compound Type์ด๋ค.
ํํ ๋ด์์๋ ์๋ก ๋ค๋ฅธ ํ์์ ๊ฐ์ ๋์์ ์ ์ฅํ ์ ์๋ค. ์๋ ์์๋ฅผ ๋ณด์.
let phoneInfo = ("iPhoneX", 14.5, 3) type(of: phoneInfo) // (String, Double, Int).Type์์ phoneInfo์ ์๋ก ๋ค๋ฅธ ํ์์ ๊ฐ์ง 3๊ฐ์ ๊ฐ์ ํํ๋ก ์ ์ฅํ๋ค.
phoneInfo์ ํ์ ์ (String, Double, Int)์ ์ ์ฅํ๋ ํํ์ด๋ค.
์ด๋ ๊ฒ ํํ ๋ด์ ์๋ ๊ฐ๋ค์ ๋ฉค๋ฒ๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ,
ํํ์ด ํ๋ฒ ์์ฑ๋๊ณ ๋๋ฉด ํํ ๋ด์ ์๋ก ๋ฉค๋ฒ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ ์ ์๋ค.
๋์ ์, ๋ฉค๋ฒ์ ์ ์ฅ๋ ๊ฐ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๊ฐ๋ฅํ๋ค.
ํ์ง๋ง ์์ phoneInfo ํํ์ ์์๋ก ์ ์ฅ๋์ด์์ผ๋ฏ๋ก ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค.
์๋ก์ด ๋ณ์์ ํํ์ ์ ์ฅํด๋ณด์.
var newPhoneInfo = phoneInfo์ด๋ ๊ฒ newPhoneInfo๋ผ๋ ๋ณ์์ phoneInfo๋ฅผ ์ ์ฅํ๋ค.
ํํ์ ๊ฐ ํ์์ด๊ธฐ ๋๋ฌธ์ newPhoneInfo์ ๊ธฐ์กด์ ๊ฐ์ด ๋ณต์ฌ๋๋ค.
ํํ ๋ด์ ๋ฉค๋ฒ์ ์ ๊ทผํ ๋์๋ ํํ ์ด๋ฆ๊ณผ .์ ์ฐ๊ณ ๋ค์ ์ธ๋ฑ์ค (์ซ์)๋ฅผ ์จ์ฃผ๋ฉด ๋ฉค๋ฒ์ ์ ๊ทผํ ์ ์๋ค.
์ด๋ฅผ ์ ๋ฌธ๋ฒ์ด๋ผ๊ณ ํ๋๋ฐ, Swift์์๋ Explicit Member Expression์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
0-based Index์ด๋ฏ๋ก ์ธ๋ฑ์ค๋ 0๋ถํฐ ์์ํ๊ณ , 0์ ์ฐ๋ฉด 0๋ฒ์งธ ์ธ๋ฑ์ค์ ์ ์ฅ๋ ๋ฉค๋ฒ์, 1์ ์ฐ๋ฉด 1๋ฒ์งธ ์ธ๋ฑ์ค์ ์ ์ฅ๋ ๋ฉค๋ฒ์ ์ ๊ทผํ ์ ์๋ค.
tupleName.index
์ด์ ์ ๋ฌธ๋ฒ์ ์ด์ฉํด์ newPhoneInfo.1์ ์ ์ฅ๋ ๊ฐ์ 15๋ก ๋ณ๊ฒฝํด๋ณด์.

๊ทธ๋ ๋ค๋ฉด phoneInfo์ 1๋ฒ์งธ ์ธ๋ฑ์ค์ ์ ์ฅ๋ ๊ฐ๋ 15๋ก ๋ฐ๋์์๊น?
๋ฐ๋์ง ์์๋ค. ์์ ๋งํ๋ฏ์ด ํํ์ ๊ฐ ํ์์ด๊ธฐ ๋๋ฌธ์ phoneInfo์ ๊ฐ์ด newPhoneInfo์ ๋ณต์ฌ๋์ด ์ ์ฅ๋์๋ค.
๊ฐ ํ์์ ๋ํด์๋ ๋์ค์ ๋ ์์ธํ ๊ณต๋ถํ๋๋ก ํ์.

์ด๋ ๊ฒ ํํ ๋ด์ ๋ฉค๋ฒ์ ์ธ๋ฑ์ค๋ฅผ ์ด์ฉํด์ ์ ๊ทผํด๋ณด์๋ค.
์์์ ์ฌ์ฉํ๋ ํํ๋ค์ ๋ชจ๋ Unnamed Tuple์ด๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ, ์ธ๋ฑ์ค๋ฅผ ํตํด ์ ๊ทผํ๋ค๋ณด๋ ์๋ฌด๋๋ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋ค.
์ด๋ฒ์๋ ํํ ๋ด์ ๋ฉค๋ฒ์ ์ด๋ฆ์ ๋ถ์ฌ์ ์ ๊ทผํด๋ณด๋๋ก ํ์.
๋ฉค๋ฒ์ ์ด๋ฆ์ ๋ถ์ด๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๋ค.
ํจ์์์ Argument Label์ ์จ์ฃผ๋ ๊ฒ๊ณผ ๊ฐ์ด ์์ ์ด๋ฆ์ ๋ถ์ฌ์ ์ ์ฅํ๋ฉด ๋๋ค.
let namedTuple = (model: "iPhoneX", os: 14.5, year: 3)์ด์ ๋ฉค๋ฒ ์ด๋ฆ์ ํตํด์ ํํ์ ์ ๊ทผํ ์ ์๋ค. ์ด๋ ๊ฒ ์ด๋ฆ์ ๋ถ์ด๋ ํํ์ Named Tuple์ด๋ผ๊ณ ํ๋๋ฐ, ์ฝ๋์ ๊ฐ๋ ์ฑ์ด ๋ ๋์์ง๋ค๋ ์ฅ์ ์ด ์๋ค.
tupleName.memberName
๊ทธ๋ ๋ค๋ฉด ํํ์ ๋ฉค๋ฒ๋ฅผ ๋ฐ๋ก ์์๋ ๋ณ์๋ก ์ ์ฅํ ์๋ ์์๊น?
Tuple Decomposition (ํํ ๋ถํด) ์ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฅํ๋ค.
Tuple Decomposition์ ํํ์ ์ ์ฅ๋์ด์๋ ๋ฉค๋ฒ๋ฅผ ๊ฐ๋ณ ์์๋ ๋ณ์์ ์ ์ฅํ ์ ์๋ค.
Tuple Decomposition์ ๋ฌธ๋ฒ์ ์๋์ ๊ฐ๋ค.
let (name1, name2, ...) = tupleName var (name1, name2, ...) = tupleNameํํ์ด ๋ถํด๋์ด name1, name2์ ์ฐจ๋ก๋๋ก ํํ์ ๋ฉค๋ฒ๊ฐ ์ ์ฅ๋๋ค.
์ด ๋, ์ด๋ฆ์ ๊ฐฏ์๋ ํํ์ ์ ์ฅ๋ ๋ฉค๋ฒ์ ์์ ๋ฐ๋์ ๊ฐ์์ผ ํ๋ค. ๋ง์ฝ ์๊ฐ ๊ฐ์ง ์๋ค๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
์์๋ฅผ ๋ณด์.

a, b, c๋ผ๋ ์ด๋ฆ์ ๊ฐ๊ฐ phoneInfo์ 0๋ฒ์งธ ์ธ๋ฑ์ค๊ฐ, 1๋ฒ์งธ ์ธ๋ฑ์ค๊ฐ, 2๋ฒ์งธ ์ธ๋ฑ์ค๊ฐ์ ์ ์ฅํ๊ณ ์๋ค.
๋ง์ฝ ํํ์ ๋ฉค๋ฒ ์ค ํน์ ๋ฉค๋ฒ๋ฅผ ์ ์ธํ๊ณ ์ด๋ฆ์ ์ ์ฅํ๊ณ ์ถ์ ๊ฒฝ์ฐ, ์์ผ๋์นด๋ ํจํด์ ์ด์ฉํ๋ฉด ๋๋ค.

๋ค์ ์์๋ฅผ ๋ณด์.
let point = (5, 5) if point.0 > 0 && point.1 > 0 { print("์ 1์ฌ๋ถ๋ฉด") }point.0๊ณผ point.1์ ๊ฐ์ด ๋ชจ๋ 0๋ณด๋ค ํฌ๊ธฐ ๋๋ฌธ์ "์ 1์ฌ๋ถ๋ฉด"์ ์ถ๋ ฅํ๋ค.
๋ง์ฝ ์ฌ๊ธฐ์ ์กฐ๊ฑด์ ๋ ์ถ๊ฐํ๋ค๋ฉด, ์ฝ๋๋ ๋ ๋ณต์กํด์ง ๊ฒ์ด๋ค.
switch๋ฌธ์์ ์๋์ ๊ฐ์ด Tuple Matching์ ์ด์ฉํ๋ฉด ์ฝ๋๋ฅผ ๋ ๊น๋ํ๊ฒ ์งค ์ ์๊ณ , ๋ค์ํ ์กฐ๊ฑด์ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์๋ค.
switch point { case (0..., 0...) : print("์ 1์ฌ๋ถ๋ฉด") default: break }๋ฟ๋ง ์๋๋ผ Interval Matching, ์์ผ๋์นด๋ ํจํด, Value Binding์ ์ด์ฉํ์ฌ ๋ค์ํ ์กฐ๊ฑด์ ์ถ๊ฐํด์ ๊ตฌํํ ์ ์๋ค.
switch point { case (0..., 0...) : // Interval Matching print("์ 1์ฌ๋ถ๋ฉด") case (_, 5): // Wildcard pattern print("y์ขํ๋ 5์ด๋ค.") case let (x, y) where x > 0: // Value Binding print("x์ขํ๋ 0๋ณด๋ค ํฌ๋ค.") default: break }'Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] Enumeration (์ด๊ฑฐํ), Raw Value (์์๊ฐ) (0) 2022.02.15 [Swift] Collection (Array, Dictionary, Set) (0) 2022.02.15 [Swift] Closure, Syntax Optimization (0) 2022.02.15 [Swift] Function - 3 (Implicit Return, Function Notation, Function Types) (0) 2022.02.15 [Swift] Function - 2 (Variadic Parameter, In-Out Parameter) (0) 2022.02.15