2014.09.18 16:48

함수 호출 문법에서 missing arguments labels가 나올 때

Swift Programming을 하다보면 XCode의 문법 자동 확인 기능을 이용하게 된다. 특히, 함수 호출에 있어서는 더욱 많이 사용하게 되는데 간혹 다음과 같은 메시지를 보여주면서 문법이 잘못되었다는 표시가 되는 경우가 있다.


[그림] Missing argument labels



Xcode에서 제공하는 오류 자동 수정 기능으로, greet 함수를 호출 할 때 day라는 라벨을 붙지지 않고 있는게 이슈가 되므로 day:를 붙여 넣으라는 내용이다. 클릭하면 자동으로 day: 를 붙여 준다. 


[그림] 수정된 greet 함수 호출



그런데, 이 greet이라는 함수를 선언한 곳을 보면 다음과 같다.


[그림] greet 함수 선언



이 함수는 A Swift Tour에 나오는 예제인데, 함수 호출 시 별도 argument name 없이 사용할 수 있음을 보여준다.


[그림] Functions and Closures



이 문서에는 argument label을 붙이지 않은 그대로 greet("Bob", "Tuesday")와 같이 호출하고 있다. 그런데, 왜 XCode에서는 문법이 잘못 되었다고 표시가 되었을까?


Swift Tour의 예제가 Playground에서만 동작하고 App을 만들 때 사용하는 Project Code에서는 안되는 걸까?

아니면 argument label을 호출할 때 첫 번째 argument는 생략해도 되는 걸 보면 기존 Objective-C 코드를 재활용할 때는 못쓰는걸까?



사실 여기에는 함수(Function)에 대한 함정(?)이 숨어 있는데 앞서 호출하는 greet은 엄밀하게 이야기하면 함수(function)가 아닌 메소드(method)이다.


Swift Language Spec 문서에 의하면 메소드는 type이 관여된 것으로 함수지만, class에 속해 있는 경우 parameter의 노출에 대한 기본 정의가 여느 함수 정의에서와 달리 다르다고 한다.


Local and External Parameter Names for Methods

Function parameters can have both a local name (for use within the function’s body) and an external name (for use when calling the function), as described in External Parameter NamesThe same is true for method parameters, because methods are just functions that are associated with a type. However, the default behavior of local names and external names is different for functions and methods. 


...


Specifically, Swift gives the first parameter name in a method a local parameter name by default, and gives the second and subsequent parameter names both local and external parameter names by default.


[출처] Apple Swift Programming Language - Methods


스펙을 더 자세히 들여다 보면, 메소드는 첫번째 local parameter로 그리고 두 번째 부터는 local과 external 둘다 제공하는것을 기본으로 한다. 따라서, 앞서 greet 함수 아니 greet 메소드는 다음과 같이 첫 번째 parameter인 name은 local로 그리고 두 번째 parameter인 day는 #을 추가하여 external로 사용될 수 있는 모습이 된다.

[그림] greet method



그렇다면, 메소드를 여느 함수와 같이 external로 제공하지 않으려면 어떻게 할까? greet 함수의 경우에서처럼 day: 라는 별도 label을 없이 호출하고 싶은 경우 말이다.


Swift 함수 spec에서는 external parameter를 명시적으로 제공하고 싶지 않는 경우는 underscore 문자인 '_' 를 앞에 붙여서 선언한다. 따라서, method에서도 마찬가지로 명시적으로 '_'를 day 앞에 추가하면 argument 이름없이 호출이 가능하다.



[그림] Underscore 문자 '_' 를 사용한 external parameter 감추기


정리를 하자면 parameter 이름 노출에 있어서 함수는 기본 동작으로 underscore '_' 로 인식하고 메소드는 기본 동작으로 sharp '#'으로 인식한다.


여담으로 그냥 Playground에서도 일반적인 함수가 아닌 Class를 생성 후 method로 호출하면 Project에서와 동일한 동작을 하며, Class를 선언하는 Swift 파일에서도 Class 선언부 바깥에 함수를 선언하는 경우는 method가 아닌 함수로 선언되므로 사용에 주의 하기 바라니다.

'Technical Stubs > Apple Swift' 카테고리의 다른 글

함수 호출 문법에서 missing arguments labels가 나올 때  (0) 2014.09.18
Swift - Closures  (0) 2014.08.12
Swift - Function  (0) 2014.08.11
Swift - Control Flow  (0) 2014.08.11
Swift - Data Type #Collections  (0) 2014.08.08
Swift - String  (0) 2014.08.08
Trackback 0 Comment 0