Swift 심화(1)

EN·2022년 9월 27일

함수

  • 함수에 대해 이야기할 때 매개변수(parameter)와 인자(argument)라는 용어가 서로 혼용되고 한다. 하지만 이들에겐 미묘한 차이가 있다.
  • 함수가 호출할 때 받게 되는 값을 매개변수라고 한다.
  • 하지만 실제로 함수가 호출되고 값이 전달된 시점에서는 인자라고 부른다.

메서드

  • 본질적으로 메서드는 특정 클래스나 구조체 또는 열거형과 연관된 함수다.
  • 예를 들어, Swift클래스 내에서 함수를 선언했다면 이것은 메서드로 간주된다.
  • 특별한 언급이 없다면 함수에 대해 설명하는 규칙과 동작 모두가 메서드에서도 동일하게 적용된다.

함수 시그니처

  • 함수명과 반환결과 타입까지를 통틀어 함수 시그니처 라고 한다.

단일 표현식에서의 암묵적 변환

  • 만약 함수가 단일 표현식을 갖고 있다면 return구문을 생략할 수 있다.
    근데 비추임.

반환값 처리하기

  • swift로 개발할 때 메서드나 함수를 호출하여 반환된 결괏값을 사용하지 않는 경우가 생긴다. 이럴 때는 반환값을 ‘_’에 할당하여 그 값을 버린다.
  • C++에서는 그냥 단순히 주의만 주지만, 스윞트에서는 에러가 발생한다.

매개변수에 할당된 디폴트 외부 매개변수명은 다음과 같이 지역 매개변수명 앞에 밑줄 문자를 써서 없앨 수 있따.

import Foundation

func buildMessageFor(_ name: String, count: Int) -> String{
  return "adasd";
}

let message = buildMessageFor("John", count : 100)
  • 물론 일일히 쓰는게 당근 좋다!

함수에 디폴트 매개변수 선언하기

import Foundation

func buildMessageFor(_ name: String="Customer", count: Int) -> String{
  return "adasd";
}

let message = buildMessageFor("John", count : 100)

가변 매개변수(variadic parameter)

let sayHello3 = {(_ names_var: String...) in 
  for name in names_var{
    print(name)
  }
}
  • 가변 매개변수를 쓸 때 …을 쓴다.
  • 앱 코드 내에서 함수가 호출될 때, 함수가 받게 될 매개변수가 몇 개 인지 알 수 없는 경우도 있다.
  • 함수가 지정된 데이터 타입의 매개변수 0개 또는 그 이상을 받는다는 것을 의미하는 점 세 개 를 이용하여 가변갯수 매개변수를 선언한다.
  • 범위에서의 …랑은 다르다.
  • 뭐 이걸…거의 쓰지는 않는다…

변수인 매개변수

  • 함수가 받는 모든 매개변수는 기본적으로 상수로 취급된다.
  • 즉, 함수의 코드 내에서 매개변수의 값이 변경되는 것을 막는다.
  • 만약 함수 내에서 매개변수의 값을 변경하고 싶다면, 매개변수의 섀도 복사본을 반드시 생성해야 한다.

입출력 매개변수로 작업하기


import Foundation

var myVal = 10
func doubleValue(_ value: inout Int)-> Int{
  value += value
  return value
}
print("before myVal = \(myVal)")
print("\(doubleValue(&myVal))")
print("After func myVal = \(myVal)")
  • inout이란 키워드를 파라미터에다 쓰고, 그리고 파라미터 넘겨줄 떄 & 쓰면 된다.

매개변수인 함수

  • swift에서는 함수가 데이터 타입처럼 취급될 수 있다.
  • 다음의 선언부처럼 함수를 상수나 변수에 할당하는 것도 가능하다
func inchesToFeet(_ inches: Float)-> Float{
  return inches * 0.833333
}

let toFeet = inchesToFeet

print("\(toFeet(10))")
  • 겉보기엔 그렇게 매력적이지 않아 보인다.
  • 왜냐하면 상수나 변수 데이터 타입에 함수를 할당하지 않아도 우리는 이 함수를 호출할 수 있기 때문에 큰 장점이 없어 보인다.
  • 하지만 상수나 변수에 할당된 함수는 여러 데이터타입의 기능을 가질 수 있따는 점을 고려하면, 앞으로 이 기능은 많은 활용을 할 수 있을 것이다.
  • 저 위에서는 inchedToFeet이지만, 만약 meterToFeet이라고 바꿀려고 하면 ? 뭔가를 바꾸려는거는 똑같지만, 그 단위만 바뀐다고 하는 상황을 가정해보자.
  • 함수의 데이터 타입은 받게 될 매개변수의 데이터 타입과 반환될 데이터타입을 조합하여 결정된다.
  • 위에 inchesToFeet은 (Float)->Float 라는 형태의 함수 데이터 타입임.

클로저 표현식

  • 클로저와 클로저 표현식은 혼용되어 불리지만, 몇 가지 큰 차이점이 있다.
  • 클로저 표현식은 독립적인 코드 블록이다.
import Foundation
let sayHello = {print("Hello")}
sayHello()
매개변수를 받아 결괏값을 반환하도록 구성할 수도 있다.
import Foundation
let multiply = {(_ val1: Int, _val2: Int) -> Int in
  return val1 * val2;
}
let result = multiply(10, 20)
  • 클로저 표현식은 이름을 갖지 않으며
  • 매개변수와 반환타입은 괄호 안에 표현되고
  • 클로저 표현식 코드의 시작을 가리키기 위하여 in 키워드를 사용한다.
  • 사실 함수는 이름이 있는 클로저 표현식일 뿐이다.
  • 클로저 표현식은 비동기 메서드 호출에 대한 완료 핸들러를 선언할 때 종종 사용된다.!
  • 람다 함수와 비슷한 갈래에서 나온 개념이다. 하지만 둘의 차이는 있다!(스윞에서는 람다라기 보다는 클로져라고 하는듯)
profile
iOS/JUJITSU

0개의 댓글