본문 바로가기
FRONT-END/iOS

자바스크립트와 비교하며 Swift 공부하기 - 함수편

by 랄라J 2023. 7. 7.

함수의 선언

  • JavaScript는 function 키워드지만, Swift는 func 키워드임
  • Swift는 함수 선언 시 파라미터(매개변수, 인자)와 타입을 지정해줘야함
  • Swift는 함수 호출 시 아규먼트(인수)는 파라미터에 명시한 대로 전달해줘야함
  • JavaScript, Swift 모두 파라미터에 기본값 선언 가능하며, 기본값 선언된 경우 해당의 파라미터 값은 인수로 전달하지 않아도 오류없음
func sampleFunc(a: String) {
  print("\(a)")
}

sampleFunc(a: "test")
// test

 

함수 선언의 다른 형태

  • Javascript의 화살표 함수와  유사하나 타입을 지정
  • Swift는 화살표를 -> 로 표시하며, -> 다음 return 될 값의 타입을 명시 후 {}를 열어 return 값을 명시
func outputFunc() -> String {
	return "아웃풋"
}
  • Swift에서 아래와 같이 입력값을 받아 return 하는 형태의 정의도 가능함
func outputFunc(a: String) -> String {
  return "아웃풋 \(a)"
}

outputFunc(a: "test")
  • Swift에서 return 값이 없는 경우에는 Void 타입이고, 적지 않아도 생략되어있는 것이라고 생각하면 됨
func voidFunc() {
	print("void type function")
}

// 위와 동일
func voidFunc() -> Void {
	print("void type function")
}

// Void 표기의 다른 형태
func voidFunc() -> () {
	print("void type function")
}

 

Swift의 아규먼트 레이블

func agumentLabelFunc (name a: String) {
	print("\(a)")
}

agumentLabelFunc(name: "rarla")
// rarla
  • 사용 시 얻게되는 이점은 함수를 호출할 때 전달해야하는 값을 명시적으로 알 수 있음
func agumentLabelFunc (_ a: String) {
	print("\(a)")
}

agumentLabelFunc("rarla")
// rarla
  • 와일드카드 패턴으로 생략해서 사용할 수 있음 (전달하고자 하는 아규먼트가 명확할 경우 사용함)

 

가변파라미터

  • JavaScript는 Rest Parameter, Swift는 Variadic Parameters라고 함
  • JavaScript는 마지막에 선언해줘야하지만, Swift는 선언 순서 상관없음
  • 두 언어 다 하나의 함수 내 한번씩만 선언할 수 있음
// JavaScript
function sum(...theArgs) {
  let total = 0;
  for (const arg of theArgs) {
    total += arg;
  }
  return total;
}

console.log(sum(1, 2, 3));
// Expected output: 6
// Swift
func variadicParameterFunc(_ numbers: Int...) -> String {
  var result = ""
  for number in numbers {
      result += ("\(number)")
    }
  return result
}

variadicParameterFunc(1,2,3,4)
// 1234

 

inout 파라미터

  • 함수 내에서 변수를 직접 수정하도록 돕는 키워드이다. 참조(메모리 주소)를 전달하는 개념
  • 함수 파라미터 타입 앞에 inout 키워드를 붙이고, 함수 호출 시 인수를 넘겨줄 때 &를 붙여서 넘김
  • 단, 변수(var)여야 가능하고 (상수, 리터럴 불가) 파라미터 기본값 선언 비허용, 가변파라미터 inout 키워드 사용 불가
var num1 = 100
var num2 = 200

function changeNumbers(a: inout Int, b: inout Int) {
	var temp = a
	a = b
	b = temp
}

changeNumbers(a: &num1, b: &num2)

 

 

함수의 오버로딩

  • JavaScript와 달리 Swift는 함수의 오버로딩을 지원한다.
  • 오버로딩이란 동일한 함수의 이름으로 여러개의 함수를 정의하는 것을 말한다.
  • 오버로딩의 장점으로 

 

함수 관련 추가 정보

  • 함수 내 파라미터는 javascript에서는 const, swift에서는 let으로 선언되는 것으로 함수 내부에서 값을 변경할 수 없음
  • swift 함수 표기 시
    • 파라미터가 없는 경우 `sampleFunc`로 ()를 생략해 표기함 
    • 파라미터가 여러개인 경우 `sampleFunc(str1:str2)`와 같이 ,없이 표기함
    • 아규먼트 레이블이 있는 경우 `sampleFunc(n:)과 같이 아규먼트 레이블을 표기함
    • 아규먼트 레이블이 생략된 경우 `sampleFunc(_:_:)와 같이 표기함
728x90

댓글