본문 바로가기
프로그래밍/iOS

[iOS] Swift 공부 - 5

by Cian 2023. 10. 16.

▶ Argument Label vs Parameter Name

 

-Parameter Name

함수의 선언부에서 사용되는 이름을 말한다. 이 이름은 함수 내부에서 해당 매개변수 값을 참조하는 데 사용된다.

def greet(name):  # 여기서 'name'이 parameter name이다.
    print(f"Hello, {name}!")

 

-Argument Label

일부 프로그래밍 언어(특히 Swift와 같은 언어)에서는 함수를 호출할 때 인자로 전달되는 값에 라벨을 붙일 수 있다. 이것이 바로 Argument Label이다. 이렇게 하면 코드를 읽고 이해하기가 더 쉬워진다.

func greet(person name: String) {  // 여기서 'person'이 argument label, 'name'이 parameter name이다.
    print("Hello, \(name)!")
}

greet(person: "John")  // 함수 호출 시 argument label을 사용한다.

 

 

▶function 리터럴(literal)

 

리터럴(literal)은 프로그래밍 언어에서 고정된 값을 표현하는 데 사용되는 표기법이다. 예를 들어, 숫자 10, 문자열 "Hello World", 불리언 값 true 및 false 등은 모두 리터럴이다. Function 리터럴이라는 개념은 일부 프로그래밍 언어에서 익명 함수(또는 람다 함수)를 정의하는 방식을 말한다. 이것은 이름이 없는 함수를 만들고, 이 함수를 변수에 할당하거나 다른 함수에 인자로 전달하는 등의 용도로 사용된다.

 

var add = function(x, y) {  // function literal
    return x + y;
};

console.log(add(1, 2));  // 결과: 3

 

 

▶옵셔널 타입 강제 언래핑

 

옵셔널 타입은 어떤 값이 존재하거나 존재하지 않을 수 있는 상황을 표현하는데 사용되는 타입이다. Swift와 같은 언어에서는 옵셔널 타입을 사용하여 null 또는 nil 값의 가능성을 명시적으로 다룬다. 옵셔널 값을 사용할 때, 그 안에 있는 실제 값을 가져오기 위해 '언래핑(unwrapping)'이라는 과정이 필요하다. 이는 옵셔널의 상태를 확인하고 실제 값을 추출하는 것을 의미한다. '강제 언래핑(forced unwrapping)'은 옵셔널 값을 바로 언래핑하는 방법이다. Swift에서 강제 언래핑은 느낌표(!)를 사용하여 수행된다.

추가로  '조건부 언래핑(optional binding)' 또는 'nil 병합 연산자(nil-coalescing operator)' 등을 통해 옵셔널 값을 처리하는 것이 좋다.

 

// Optional Binding
if let unwrappedString = optionalString {
    print(unwrappedString)
} else {
    print("Value is nil")
}

// Nil-Coalescing Operator
let unwrappedString = optionalString ?? "Default Value"
print(unwrappedString)

 

 

▶guard let을 활용한 optional binding

 

func greet(_ person: String?, nicely: Bool = true) {
    guard let name = person else {
        print("I don't know who you are.")
        return
    }

    if nicely {
        print("Hello, \(name)!")
    } else {
        print("Oh no, it's \(name) again...")
    }
}

var optionalName: String? = "John"
greet(optionalName)  // 출력: Hello, John!

optionalName = nil
greet(optionalName)  // 출력: I don't know who you are.

 

 

▶가변 매개변수

 

가변 매개변수(variadic parameter)는 함수에 임의의 개수의 인자를 전달할 수 있게 해주는 기능이다. 즉, 한 가지 타입의 값을 여러 개 받을 수 있다. Swift에서 가변 매개변수를 정의하려면, 해당 매개변수 이름 뒤에 점 세 개(...)를 붙인다. Swift는 이러한 매개변수들을 배열로 처리한다.

 

func sum(_ numbers: Int...) -> Int {
    var total = 0
    for number in numbers {
        total += number
    }
    return total
}

print(sum(1, 2, 3))  // 출력: 6
print(sum(1, 2, 3, 4, 5)) // 출력:15

 

 

▶1급 객체와 1급 시민

 

특정 개체가 어떤 프로그래밍 언어의 기본적인 작업에 사용될 수 있는지를 나타낸다. 이러한 기본적인 작업에는 변수 할당, 인자 전달, 함수에서의 반환 등이 포함된다. 특히 함수를 1급 객체로 취급하는 언어를 '함수형 프로그래밍 언어'라고 부르기도 한다. Swift 역시 함수를 1급 객체로 취급하는 언어 중 하나이다. 그 특징으로는

 

-함수를 변수나 상수에 할당할 수 있다.

func add(a: Int, b: Int) -> Int {
    return a + b
}
let myFunction = add
print(myFunction(3, 4)) // 출력: 7

 

-함수를 다른 함수의 인자로 전달할 수 있다.

func applyOperation(a: Int, b: Int, operation: (Int, Int) -> Int) -> Int {
    return operation(a, b)
}
print(applyOperation(a: 3, b: 4, operation: add)) // 출력 :7

 

-함수가 다른 함수의 결과로서 반환될 수 있다.

func getAdder() -> ((Int, Int) -> Int){
    return add;
}
let anotherAdder = getAdder()
print(anotherAdder(5 ,6)) // 출력 :11

 

 

▶후행 클로저

 

Swift에서 클로저는 이름이 없는 함수와 같은 개념이다. 클로저는 변수나 상수에 할당될 수 있고, 다른 함수의 인자로 전달될 수도 있다. 후행 클로저(Trailing Closure)는 함수의 마지막 매개변수가 클로저일 때, 그 클로저를 함수 괄호 밖에 작성하는 문법을 말한다. 이렇게 하면 코드가 더 읽기 쉽고 명확해진다.

 

func mul(a: Int, b: Int) -> Int { 
return a * b
}

// closure
let multiply = {(a: Int, b: Int) -> Int in
return a * b
}
print(mul(a:10, b:20))
print(multiply(10, 20)) 

// closure
let add = {(a: Int, b: Int) -> Int in
return a + b
}
print(add(10, 20))

var result = math(x: 10, y: 20, cal: add) // return add(10,20)
print(result)

result = math(x: 10, y: 20, cal: multiply) // return multiply(10,20)
print(result)

result = math(x: 10, y: 20, cal: {(a: Int, b: Int) -> Int in
return a + b
})
print(result)

result = math(x: 10, y: 20, cal: {(a: Int, b: Int) -> Int in
return a + b
})
print(result)

// trailing closure
result = math(x: 10, y: 20) {(a: Int, b: Int) -> Int in
return a + b
}
print(result)

 

 

▶클로저의 축약

 

Swift의 클로저는 매개변수와 반환 타입을 추론할 수 있기 때문에 축약형 표현을 사용할 수 있다. 또한, 인라인 클로저에서 매개변수 이름 대신 위치 기반 인자 이름($0, $1, $2 등)을 사용할 수 있다.

 

-원래 코드

let numbers = [1, 5, 3, 6, 2]
let sortedNumbers = numbers.sorted(by: { (s1: Int, s2: Int) -> Bool in
    return s1 < s2
})

 

-매개변수와 반환 타입 추론

클로저의 매개변수와 반환 타입은 sort 함수가 요구하는 형태를 이미 알고 있으므로 생략할 수 있다.

let sortedNumbers = numbers.sorted(by: { s1, s2 in return s1 < s2 })

 

-단일 표현식 클로저에서는 암묵적으로 return 키워드를 사용한다.

let sortedNumbers = numbers.sorted(by: { s1, s2 in s1 < s2 })

 

-위치 기반 인자 이름 사용

let sortedNumbers = numbers.sorted(by: { $0 < $1 })

 

-후행 클로저(Trailing closure) 사용

let sortedNumbers = numbers.sorted { $0 < $1 }
// $(shorthand argument name) : 매개변수를 생략하고 사용

'프로그래밍 > iOS' 카테고리의 다른 글

[iOS] Swift 공부 - 7  (0) 2023.10.30
[iOS] Swift 공부 - 6  (0) 2023.10.16
[iOS] Swift 공부 - 4  (0) 2023.10.10
[iOS] Swift 공부 - 3  (0) 2023.09.25
[iOS] Swift 공부 - 2  (0) 2023.09.25