What is inout?
- Swift์์ ํจ์์ ํ๋ผ๋ฏธํฐ๋ ์์์ด๋ฏ๋ก ํจ์ ๋ด๋ถ์์ ํ๋ผ๋ฏธํฐ์ ๊ฐ์ ๋ณ๊ฒฝ ๋ถ๊ฐ
- ํจ์์์ ํ๋ผ๋ฏธํฐ์ ๊ฐ์ ๋ณ๊ฒฝํ๊ธธ ์ํ๊ณ + ๋ณ๊ฒฝ๋ ๊ฐ์ด ํจ์ ํธ์ถ์ด ์ข ๋ฃ๋ ํ์๋ ์ง์๋๊ธธ ์ํ ๋ inout ์ฌ์ฉ
- ํ๋ผ๋ฏธํฐ๋ก ๋ณ์์ ์ฃผ์๊ฐ์ ๋๊ฒจ ์ง์ ์ ๊ทผํ ์ ์๋๋ก ํด์ฃผ๋ ๊ธฐ๋ฅ
func increment(_ number: Int){
number += 1
print(number)
}
increment(3)
// Error: 'number' is a 'let' constant
var number = 3
func increment(_ number: inout Int){
number += 1
print(number)
}
increment(&number) // 4
How to use inout?
- ํจ์ ์ ์ ์ ๋ฐ์ดํฐ ํ์ ์์ inout ํค์๋ ์ถ๊ฐ
- in-out ํ๋ผ๋ฏธํฐ๋ ๋ณ์๋ง์ ์ทจ๊ธ
- ํจ์์ ์ธ์๋ก ์ ๋ฌ ์ &๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ๊ฐ์ด ํจ์ ๋ด๋ถ์์ ๋ณ๊ฒฝ๋ ๊ฒ์์ ๋ํ๋ด์ผํจ
func swapNumbers(_ a: inout Int, _ b: inout Int){
let tmp = a
a = b
b = tmp
}
var x = 3
var y = 4
swapNumbers(&x, &y) // x = 4, y = 3
์๋ฆฌ
๐ copy-in copy-out ( call by value result )
(1) ํจ์๊ฐ ํธ์ถ๋๋ฉด, argument ๊ฐ์ด ๋ณต์ฌ๋๋ค.
(2) ํจ์ body์์, (1)์์ ๋ณต์ฌํ ๊ฐ์ ์์ ํ๋ค.
(3) ํจ์๊ฐ ๋ฐํ๋ ๋, ์์ ํ ๋ณต์ฌํ ๊ฐ์ ์๋ณธ ๋ณ์์ ์ฌํ ๋นํ๋ค.
var number: Int = 3{
didSet {
print("number didSet")
}
}
func setNumber(_ n: inout Int){
print(n) // 3
n += 1
print(n) // 4
}
setNumber(&number) // number didSet
์ฃผ์์ฌํญ
- ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ์ฃผ์
- ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์, ์ฝ๊ธฐ & ์ฐ๊ธฐ๊ฐ ๋์์ ์ด๋ฃจ์ด์ ธ ์ถฉ๋ ๋ฐ์ ๊ฐ๋ฅ
var stepSize = 1
func increment(_ number: inout Int){
number += stepSize
}
increment(&stepSize)
// Error: Fatal access conflict detected
'๐ iOS > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] reduce ์ฌ์ฉํ๊ธฐ | sum (0) | 2022.07.28 |
---|---|
[Swift] map, flatMap, compactMap ? (0) | 2022.06.28 |
[Swift] Protocols | Delegate๋ฅผ ์ด์ง ๊ณ๋ค์ธ (0) | 2022.02.25 |
[Swift] Guard๋ฌธ | guard let (0) | 2021.08.03 |
[Swift] Optionals (0) | 2021.07.26 |