'2014/09'에 해당되는 글 2건

  1. 2014.09.18 함수 호출 문법에서 missing arguments labels가 나올 때
  2. 2014.09.03 티스토리 블로그에 소스코드 넣기 #1 Syntax Highlighter
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
2014.09.03 10:43

티스토리 블로그에 소스코드 넣기 #1 Syntax Highlighter

티스토리 블로그를 사용하다 보면 소스 코드를 올려야 할 경우가 종종 발생한다. 코드야 첨부 파일로 업로드 하는 경우도 있지만, 블로그 내용에 포함 시키려면 어지간하지 귀찮아진다.

간략하게는 Courier 계열의 Font만 사용하기도 하지만 이쁘게 보이지도 않고, 결국에는 별도 Editor 화면을 캡쳐해서 첨부하기도 하는데 그것도 이미지로 첨부하는 거라 꽤 귀찮은 일이다.


다른 블로그에서는 어떻게 제공하는가 봤더니 꽤 다양한 방법을 제시하고 있었고 그 중 다음 두 가지로 압축되었다.


1. HightlightJS - https://highlightjs.org

- 장점 : 깔끔한 UI, CDN 배포, Apple Swift 지원

- 단점 : Line Number 표시하려면 별도 Branch에서 받아야 함


2. Syntax Highlighter - http://alexgorbatchev.com/SyntaxHighlighter

- 장점 : Line Number 표시, 다양한 설정

- 단점 : 기본 Theme 구림, CDN 없음 (홈페이지에서 배포하고 있으나 PoC용임)


일단, 사용법은 둘 다 비슷하지만, 일단은 Syntax Highligter를 먼저 선택해 보았다.


<link href="http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css" rel="stylesheet" type="text/css" />

<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js" type="text/javascript"></script>

<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shAutoloader.js" type="text/javascript"></script>


그리고 body의 제일 마지막 부분에 다음과 같은 코드를 추가한다.


<script type="text/javascript">

SyntaxHighlighter.defaults.toolbar = false;

SyntaxHighlighter.all()

</script>


다음은 필요한 Hightlight를 할 Brush를 추가해야하는데 현재 버젼 (3.0.83)에서 지원하는 Brush 종류는 꽤 다양하다. 일단은 JavaScript만 먼저 테스트를 해 보자.


JavaScript에 대한 Brush는 shBrushJScript.js 이므로 다음과 같이 추가한다.

<script src="http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js" type="text/javascript"></script> 


다른 언어에 대한 Brush는 다음 링크를 참고 한다.


http://alexgorbatchev.com/SyntaxHighlighter/manual/brushes/


Sample Code는 <pre><code>로 담으면 자동으로 언어를 인식한다. 만약 제대로 동작하지 않는다면 <code> 태그에 class attribute로 해당 코드의 언어 이름을 넣어준다. 예를 들면 다음과 같다.


<pre class="brush: js;">

var a = 100;

function test() {

   return 'Hello, World'

}

</pre>


그러면 아래와 같이 라인 번호와 함께 나온다.

참고로, 3.0.83 버젼에는 swift에 대한 Brush가 빠져 있다. 


다음 글을 참고하여 Brush를 하나 마련해 보자.


http://wordpress.org/plugins/syntaxhighlighter-evolved-swift-brush/


기본적인 작성 방법은 다른 Brush 처럼 해당 언어에서 사용하는 주석이나 keyword에 대한 부분을 별도로 묶고 해당 부분을 어떤 색으로 보여줄 지에 대한 구성으로 되어 있다. Swift의 경우 Language Spec에 각종 정보들이 들어 있으며 다음과 같이 Brush에서 사용할 keyword 들을 정리했다.


1. datatypes

Character Bool Double Float

Int Int8 Int16 Int32 Int64

UInt UInt8 UInt16 UInt32 UInt64

AnyObject String Void


2. keywords

IBAction IBOutlet true false nil

super self Self copy

as break case class

continue convenience dynamic final private

default get set willSet didSet

else enum if is in infix internal for fallthrough func import inout

let lazy mutable

naked namespace new noinline noreturn nothrow NSCopying NSManaged mutating objc override operator optional prefix protocol

private public required return

static struct switch

T typealias UnsafePointer var

unowned weak where while


3. functions

advance enumerate find filter join

min map max print println sizeof sort init


shBrushSwift.js

Trackback 0 Comment 0