빙수왕의 개발일지

_ sender: Any에서 언더바 _는 뭘까 - 전달인자 라벨, 와일드카드 식별자 본문

개발/iOS

_ sender: Any에서 언더바 _는 뭘까 - 전달인자 라벨, 와일드카드 식별자

빙수킹 2020. 7. 18. 01:57

일단 내가 무작정 처음 예제 앱을 만들면서 생소했던 것들은..

 

1.

왜 가끔 정의된 함수들에 변수명 앞에 또 뭐가 있는지? (위에서는 for 같은 것)

 

2.

함수를 호출할 때 sender: 이런식으로 가이드 텍스트가 자동으로생기는데 왜 지우면 에러가 나는지? 당연히 그냥 엑스코드 기능인줄 알았는데 진짜 텍스트였음

 

3.

또 "_"라던지 "."는 뭐하는애인지 .. 이런것들이였다.

 

 

이건 다 전달인자 레이블(Argument Label)을 몰라서 못알아먹는거였다..

 

다음과 같은 함수가 있다고 가정했을 때, 

func introduce(to name: String) → () {
	
}

// 함수 호출
introduce(to: "나리")

 

Parameter, Argument, Argument Label, 함수명에 해당하는 값은 다음과 같다.

 

name - Parameter 매개변수 

 * backquote 감싸주면 var과같은 키워드도 이름으로 사용할 있다

 * 호출할 때 이 이름을 앞에 name: 이런식으로 쓰는게 강제임.

"나리" - Argument 전달인자 (실제 호출  전달하는 값) 

to - Argument Label 전달인자 레이블

 * 자바와는 다르게 전달인자 레이블이라는 개념이 있다.

 * 이게 쓰이면 함수 호출 시 파라미터 이름 대신 보이게 되지만, 파라미터 이름이 바뀌는건 아니므로 함수 내부에서는 쓰이지 못한다.

 * 사용하고 싶지 않다면 와일드카드 식별자(_)를 사용한다. 이놈은 카드게임에서의 조커와 같다. 뭐든지 될 수 있다. 그래서 안써도 상관이 없게 해주는 역할..

 * 레이블을 바꾸면 함수의 이름도 바뀐다!!! 아래 함수명처럼.  오버로딩도 가능해진다.

 * 왜쓰는거냐? 가독성 때문인 것 같다. 주로 전치사를 사용해서 책읽듯이 코드가 읽힐 수 있도록 돕는 용도라고 하는데 ... 

함수명 - introduce(to:)

 

그래서 결론은.. 아래와 같다..

// 1. 일반적 함수
func normalFunc(name: String) {
}
// 함수호출
normalFunc(name: "나리")
// 함수이름: normalFunc(name:)

// 2. 전달인자 레이블을 사용한 함수
func usingArgumentLabelFunc(to name: String) {
}
// 함수호출
usingArgumentLabelFunc(to: "나리")
// 함수이름: usingArgumentLabelFunc(to:)


// 3. 전달인자 레이블을 와일드카드 식별자로 사용하는 함수 - 함수호출 시 자바에서처럼 호출
func usingWildCardLabelFunc(_ name: String) {
}
// 함수호출
usingWildCardLabelFunc("나리")
// 함수이름: usingWildCardLabelFunc(_:)

 

"."은 Implicit Member Expression

 

Expressions — The Swift Programming Language (Swift 5.3)

Expressions In Swift, there are four kinds of expressions: prefix expressions, binary expressions, primary expressions, and postfix expressions. Evaluating an expression returns a value, causes a side effect, or both. Prefix and binary expressions let you

docs.swift.org

이였다. 객체이름을 생략하고(부르는 객체를 스위프트가 유추할 수 있을 때) 멤버를 부를 때 사용하는 것이였음.!