๐ซ ๊ณต๋ถํ๋ค๊ฐ ๊ธฐ๋กํด๋๋ฉด ์ข๊ฒ ๋ค, ๋ชฐ๋๋ ๊ฑฐ๋ค ์ถ์ ๋ด์ฉ์ ์์ฃผ๋ก ์ ๋ฆฌํ์ต๋๋ค.
1๏ธโฃ ์ ์ถ๋ ฅ ๋งค๊ฐ๋ณ์๋ฅผ ํ์ฉ
๊ฐ์ด ์๋ ์ฐธ์กฐ๋ฅผ ์ ๋ฌํ๋ ค๋ฉด ์ ์ถ๋ ฅ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ค. ์๋ ๊ฐ์ ๋ณ๊ฒฝํ๋ค๋ ์ด์ผ๊ธฐ!
1. ํจ์๋ฅผ ํธ์ถํ ๋, ์ ๋ฌ์ธ์์ ๊ฐ์ ๋ณต์ฌํฉ๋๋ค.
2. ํด๋น ์ ๋ฌ์ธ์์ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด 1์์ ๋ณต์ฌํ ๊ฒ์ ํจ์ ๋ด๋ถ์์ ๋ณ๊ฒฝํฉ๋๋ค.
3. ํจ์๋ฅผ ๋ฐํํ๋ ์์ ์ 2์์ ๋ณ๊ฒฝ๋ ๊ฐ์ ์๋์ ๋งค๊ฐ๋ณ์์ ํ ๋นํฉ๋๋ค.
var numbers: [Int] = [1,2,3]
func nonReferenceParameter(_ arr: [Int]){
var copiedArr: [Int] = arr
copiedArr[1] = 1
}
func referenceParameter(_ arr: inout[Int]){
arr[1] = 1
}
nonReferenceParameter(numbers)
print(numbers[1])
referenceParameter(&numbers) // ์ฐธ์กฐ๋ฅผ ํํํ๊ธฐ ์ํด &์ ๋ถ์ฌ์ค๋๋ค.
print(numbers[1])
// 2
// 1
์ ์ถ๋ ฅ ๋งค๊ฐ ๋ณ์๋ ๋งค๊ฐ๋ณ์ ๊ธฐ๋ณธ๊ฐ์ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ๊ฐ๋ณ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉ๋ ์๋ ์๋ค.
๋ํ, ์์๋ ๋ณ๊ฒฝ๋ ์ ์์ผ๋ฏ๋ก ์ ์ถ๋ ฅ ๋งค๊ฐ๋ณ์์ ์ ๋ฌ์ธ์๋ก ์ฌ์ฉ๋ ์ ์๋ค.
๐ซ ์ ์ถ๋ ฅ ๋งค๊ฐ๋ณ์๋ ์ ์ฌ์ฉํ๋ฉด ๋ฌธ์ ์์ง๋ง ์๋ชป ์ฌ์ฉํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์์ ์ ์ํํ์ฌ ์ฌ์ฉ์ ๋ช๋ช ์ ์ฝ์ด ์๋ค.
2๏ธโฃ๋ฐ์ดํฐํ์ ์ผ๋ก์์ ํจ์
์ค์ํํธ์ ํจ์๋ ์ผ๊ธ ๊ฐ์ฒด ์ด๋ฏ๋ก ํ๋์ ๋ฐ์ดํฐ ํ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
์ฆ, ๊ฐ ํจ์๋ ๋งค๊ฐ๋ณ์ ํ์ ๊ณผ ๋ฐํ ํ์ ์ผ๋ก ๊ตฌ์ฑ๋ ํ๋์ ํ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค๋ ๋ป
์์
typealias CalculateTwoInts = (Int, Int) -> Int
func addTwoInts(_ a: Int, _ b: Int) -> Int {
return a+b
}
func multiplyTwoInts(_ a: Int, _ b: Int) -> Int{
return a*b
}
var mathFunction: CalculateTwoInts = addTwoInts
// var mathFunction: (Int, Int) -> Int = addTwoInts์ ๋์ผํ ํํ์ด๋ค
print(mathFunction(2,5))
mathFunction = multiplyTwoInts
print(mathFunction(2,5))
// 7
// 10
์๋์ ์ฝ๋์ฒ๋ผ ์ ๋ฌ์ธ์๋ก ํจ์๋ฅผ ๋๊ฒจ ์ค ์๋ ์๋ค.
typealias CalculateTwoInts = (Int, Int) -> Int
func addTwoInts(_ a: Int, _ b: Int) -> Int {
return a+b
}
func multiplyTwoInts(_ a: Int, _ b: Int) -> Int{
return a*b
}
func printMathResult(_ mathFunction: CalculateTwoInts, _ a: Int, _ b: Int){
print("Result: \(mathFunction(a,b))")
}
printMathResult(addTwoInts, 3, 5)
// Result: 8
ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ ์ ํ ํจ์๋ฅผ ๋ฐํํด์ค ์๋ ์๋ค.
typealias CalculateTwoInts = (Int, Int) -> Int
func addTwoInts(_ a: Int, _ b: Int) -> Int {
return a+b
}
func multiplyTwoInts(_ a: Int, _ b: Int) -> Int{
return a*b
}
func printMathResult(_ mathFunction: CalculateTwoInts, _ a: Int, _ b: Int){
print("Result: \(mathFunction(a,b))")
}
func chooseMathFunction(_ toAdd: Bool) -> CalculateTwoInts{
return toAdd ? addTwoInts : multiplyTwoInts
}
printMathResult(chooseMathFunction(true), 3, 5)
// Result: 8
3๏ธโฃ ์ค์ฒฉํจ์ ์ฌ์ฉํ๊ธฐ
์์ ์ผ๋ก ์ด๋ํ๊ธฐ ์ํ ํจ์ (์ค์ฒฉํจ์ ์ฌ์ฉ X)
typealias MoveFunc = (Int) -> (Int)
func goRight(_ currentPosition: Int) -> Int {
return currentPosition + 1
}
func goLeft(_ currentPosition: Int) -> Int {
return currentPosition - 1
}
func functionForMove(_ shouldGoLeft: Bool) -> MoveFunc {
return shouldGoLeft ? goLeft : goRight
}
var position: Int = 3
let moveToZero: MoveFunc = functionForMove(position > 0)
print("์์ ์ผ๋ก ๊ฐ์๋ค")
while position != 0 {
print("\(position)...")
position = moveToZero(position)
}
print("์์ ๋์ฐฉ")
// ์์ ์ผ๋ก ๊ฐ์๋ค
// 3...
// 2...
// 1...
// ์์ ๋์ฐฉ
์ค์ฒฉํจ์ ์ฌ์ฉ
typealias MoveFunc = (Int) -> (Int)
func functionForMove(_ shouldGoLeft: Bool) -> MoveFunc {
func goRight(_ currentPosition: Int) -> Int {
return currentPosition + 1
}
func goLeft(_ currentPosition: Int) -> Int {
return currentPosition - 1
}
return shouldGoLeft ? goLeft : goRight
}
var position: Int = -4
let moveToZero: MoveFunc = functionForMove(position > 0)
print("์์ ์ผ๋ก ๊ฐ์๋ค")
while position != 0 {
print("\(position)...")
position = moveToZero(position)
}
print("์์ ๋์ฐฉ")
// ์์ ์ผ๋ก ๊ฐ์๋ค
// -4...
// -3...
// -2...
// -1...
// ์์ ๋์ฐฉ
4๏ธโฃ ๋ฐํ ๊ฐ์ ๋ฌด์ํ ์ ์๋ ํจ์
@discardableResult ์ ์ธ ์์ฑ ์ฌ์ฉ
@discardableResult ? ๋ฐํ ๊ฐ์ ์ฌ์ฉํ์ง ์์๋ค๊ณ ๋ฏธ๋ฆฌ ์๋ฆผ์ผ๋ก์จ, ์ปดํ์ผ๋ฌ๊ฐ ์ด์ ๋ํ ๊ฒฝ๊ณ ๋ฌธ๊ตฌ๋ฅผ ๋ ๋ฆฌ์ง ์๋๋ก ํ๋ค.
func say(_ something: String) -> String{
print(something)
return something
}
@discardableResult func discardableResultSay(_ something: String)-> String{
print(something)
return something
}
// ๋ฐํ ๊ฐ์ ์ฌ์ฉํ์ง ์์์ผ๋ฏ๋ก ์ปดํ์ผ๋ฌ๊ฐ ๊ฒฝ๊ณ ๋ฅผ ํ์ํ ์ ์๋ค.
say("Hello")
// ๋ฐํ ๊ฐ์ ์ฌ์ฉํ์ง ์์ ์ ์๋ค๊ณ ๋ฏธ๋ฆฌ ์๋ ธ๊ธฐ ๋๋ฌธ์
// ๋ฐํ ๊ฐ์ ์ฌ์ฉํ์ง ์์๋ ์ปดํ์ผ๋ฌ๊ฐ ๊ฒฝ๊ณ ํ์ง ์๋๋ค.
discardableResultSay("Hello")
// Hello
// Hello
Reference
Swift ์ค์ํํธ ํ๋ก๊ทธ๋๋ฐ - ์ผ๊ณฐ
'Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] ๊ตฌ์กฐ์ฒด์ ํด๋์ค (0) | 2022.03.17 |
---|---|
[Swift] ์ต์ ๋ : ์ต์ ๋ ์ถ์ถ (0) | 2022.03.17 |
[Swift] ์ฌ์ฉ์ ์ ์ ์ฐ์ฐ์ : ์ ์, ์ค์, ํ์ ์ฐ์ฐ์ (0) | 2022.03.15 |
[Swift] ์ด๊ฑฐํ ( ํญ๋ชฉ ์ํ, ์ํ ์ด๊ฑฐํ ) (0) | 2022.03.15 |
[Swift] ์ปฌ๋ ์ ํ : ๋ฐฐ์ด, ๋์ ๋๋ฆฌ, ์ธํธ (0) | 2022.03.15 |