๐ŸŽ iOS/Swift

[Swift] inout? | ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์ง€์†ํ•˜๊ธฐ

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