'2014/08'에 해당되는 글 13건

  1. 2014.08.27 IBM IoT Cloud Raspberry Pi Node JS를 이용한 Test
  2. 2014.08.27 Raspberry Pi에 Node-JS 설치하기 (2)
  3. 2014.08.26 라즈베리 파이 모니터 없이 쓰기
  4. 2014.08.12 Swift - Closures
  5. 2014.08.11 Swift - Function
  6. 2014.08.11 Swift - Control Flow
  7. 2014.08.08 Swift - Data Type #Collections
  8. 2014.08.08 Swift - String
  9. 2014.08.08 Swift - Operators
  10. 2014.08.08 Swift - Data Type #Tuple
2014.08.27 04:55

IBM IoT Cloud Raspberry Pi Node JS를 이용한 Test

IBM IoT Cloud 는 Device recipe라는 형태의 일종의 패키지를 제공하여 다양한 종류/환경의 단말이 IBM IoT Service를 이용하도록 하고 있다.


물론 라즈베리파이에 대한 Device recipe도 있으며 다음 ( https://developer.ibm.com/iot/recipes/raspberry-pi )에서 좀 더 자세한 기능을 확인 해 볼 수 있다.


IBM에서 공식적으로 제공하는 라즈베리 파이용 Device Recipe 는 Rasbian용 debian binary package 형태로 되어 있기에 Cross Compiler를 이용한 Build 환경을 갖춰야만 IBM IoT 통신 프로토콜(MQTT)을 사용하는 Client App를 개발해야 하는데, Intel Galileo용 Device recipe는 Node.js로 구성되어 있어 이를 활용해 보고자 한다.


0. 사전 준비

좀 더 시간이 지나면 Node.js용으로 필요한 부분만 사용 할 수 있도록 정리하겠지만

일단, Node.js용으로 IBM IoT 환경을 구성한다 하더라도 라즈베리 파이용 device recipe 가 선행되어야 한다.


특히 IBM PaaS Platform인 Bluemix 등록 및 IoT Foundation 환경 구성을 비롯한 단말 정보 등록 과정들은 반드시 사전에 진행되어야 한다.



1. Node JS 설치

라즈베리 파이에 Node JS는 [ Raspberry Pi에 Node-JS 설치하기 ]를 참고


2. Node JS용 Quick Start 가져오기

앞서 이야기 했듯이 Intel Galileo용으로 제공하는 Device Recipe https://developer.ibm.com/iot/recipes/intel-galileo )인데 Node.js 실행환경이라면 사용에 별 문제가 없다.


다만, Intel Galileo의 모든 Quick Start (ibm-iot-quickstart.zip)를 다 가져올 필요는 없고 우리가 필요한 JavaScript 파일과 json 파일만 가져오도록 한다.


라즈베리용 Device Recipe에서 생성한 device.cfg와 같은 폴더에 다음과 같이 파일을 다운로드 받는다.


sudo wget -O /etc/iotsample-raspberrypi/ibm-iot-quickstart.js https://github.com/ibm-messaging/iot-galileo/raw/master/samples/nodejs/package.json/ibm-iot.js

sudo wget -O /etc/iotsample-raspberrypi/package.json https://github.com/ibm-messaging/iot-galileo/raw/master/samples/nodejs/package.json



그리고 다운로드 받은 ibm-iot.js 를 보면 deviceType이 default로 iotsample-galilieo로 되어 있다. 

이 값은 device.cfg에 정의되어 있는 경우 override 되긴 하지만 라즈베리를 위한 기본 값으로 iotsample-raspberrypi로 변경하여 저장한다.


그리고 node ibm-iot.js로 JavaScript를 실행 해 보면 MQTT 모듈이 설치되어 있지 않아 오류를 발생하게 된다.


<그림>


Quick Start에 필요한 node module은 package.json에 정의되어 있으므로 아래와 같이 npm을 이용한 node module을 설치한다.


sudo npm install


자 이제 다음과 같이 quick start를 실행 해 보면 binary로 실행되는 것처럼 메시지가 정상 동작하는 것을 확인 할 수 있다.


node ibm-iot.js -v

Trackback 0 Comment 0
2014.08.27 04:10

Raspberry Pi에 Node-JS 설치하기

라즈베리 파이에 리눅스 계열인 RASPBIAN을 설치한 경우 이를 위한 Node JS가 준비되어 있으므로 다음 몇 가지 단계를 거치면 손쉽게 Node JS 를 사용할 수 있다.

1. RASPBIAN Package 정보 업데이트


RASPBIAN은 Debian 계열의 패키지 관리 정보를 사용한다. 다음과 같이 apt-get 명령을 이용하여 해당 정보를 업데이트를 한다.

그림 <sudo apt-get upgrade>


그림 <sudo apt-get update>


2. 라즈베리파이용 NodeJS 설치


Package 정보를 업데이트 했다면 node-arm 프로젝트 홈페이지 (http://node-arm.herokuapp.com)로부터 NodeJS deb 패키지를 받아 설치한다. 현재 (2014-8-27) NodeJS 최신 공식 버전인 v0.10.31, 30, 29를 제공하므로 필요에 따라 선택한다.


다음 명령어를 이용하면 최신 버젼의 NodeJS 설치 파일을 받을 수 있다.


sudo wget http://node-arm.herokuapp.com/node_latest_armhf.deb


그리고 dpkg를 이용하여 nodejs를 설치한다.


$ sudo dpkg -i node_lasted_armhf.deb 



참고로 NodeJS 홈페이지에서도 라즈베리 파이용 패키지를 제공하고 있으나 v0.10.29 부터 v0.10.31까지는 배포되지 않고 있다.


v0.10.28 을 다음 명령어로 다운로드한다.


$ sudo wget http://nodejs.org/dist/v0.10.28/node-v0.10.28-linux-arm-pi.tar.gz


그리고 파일의 압축을 해제한다.

tar -xzvf node-v0.10.28-linux-arm-pi.tar.gz


다운로드 받은 node를 실행해 보면 현재 버젼을 확인해 볼 수 있다.

node-v0.10.28-linux-arm-pi/bin/node -v


데비안 패키지와 달리 실행 파일만 설치된 것이므로 환경 설정을 해 주어야 한다.


home 디렉토리 (/home/pi) 의 .bash_profile에 다음과 같이 NODE_JS_HOME을 설정한다.


NODE_JS_HOME=/home/pi/node-v0.10.28-linux-arm-pi

PATH=$PATH:$NODE_JS_HOME/bin



Trackback 0 Comment 2
2014.08.26 13:53

라즈베리 파이 모니터 없이 쓰기

라즈베리 파이는 학교에서 기초 컴퓨터 과학 교육 증진을 위해 만든 단일 보드 컴퓨터다.

PC와 달리 ARM 기반의 프로세서를 사용하지만 HDMI와 USB 그리고 인터넷을 위한 커넥터를 제공한다.

2014년 발표한 B+ 보드의 경우 국내에서 5만원 정도면 구할 수 있는데 달랑 보드 하나만 들어 있다.

전원을 케이블도 없고, 하드 디스크 역할을 하는 SDCard Media도 없다.


전원은 Android 충전기 연결하고 SDCard는 마트나 인터넷에서 8GB~32GB 정도로 구매하면된다.

참고로 Raspberry Pi B형의 SDCard 타입이고 B+형은 Micro SDCard 타입이다.


OS는 홈페이지에서 무료로 제공하는데 당연히 Open Source OS의 대명사인 Linux를 기반으로 되어 있다.


http://www.raspberrypi.org/downloads/


값싸게 PC 교육을 위한 장비로서 설계된 라즈베리 파이기에 기본적으로 모니터 키보드, 마우스와 같은 주변 장비를 붙일 수 있도록 외부 I/O를 제공하며, Video는 HDMI, 인터넷은 RJ45규격의 LAN 포트, 그리고 USB 포트가 구성되어 있다.


아무리 PC 교육용이라 하더라도, 이거 하나 쓰려고 일반 PC컴퓨터에서 본체 빼고 다 있어야 한다는게 좀 불편하다는 생각이 들었는데 라즈베리 파이는 다양한 OS를 제공하고 그 중 눈에 띈 Debian 계열의 ARM Linux인 RASPBIAN 의 경우 Linux 장비이므로 GUI 사용 여부를 선택 할 수 있게 되어 있다.또한, 설치 용량도 800MB 정도로 완전 기본 패키지만 제공하므로 적은 용량의 SD Card를 사용해도 부담이 덜하다.


SDCard에 설치할 이미지는 홈페이지나 토렌트를 이용하여 받을 수 있는데, 개인적으로는 토렌트를 추천한다. HTTP로 그냥 받으면 느리기도 하고 데이터가 깨지는 경우도 있는지 Binary 가 달라서 설치 오류가 나기도 했다.


1. RASPBIAN 이미지 설치


이미지에 대한 기본적인 설치 방법은 공식 홈페이지에 자세히 나와 있다.


http://www.raspberrypi.org/documentation/installation/installing-images/README.md


토렌트에서 다운로드 받은 image 파일이 2014-06-20-wheezy-raspbian.img 인데 맥북에서 dd 명령을 이용하는 방법으로 이미지를 설치했다.


근데, 정말 오래 걸린다. 명령어를 입력하면 별다른 메시지가 없이 그냥 대기한다. 

dd 명령을 실행 중에 얼만큼 진행되었는지 상태를 보려면 [Ctrl+T]를 눌러 확인이 가능한데 마지막에 출력된 메시지를 보니 2134초 즉 36분 정도 걸렸다.


그림 <dd 명령을 이용한 RASPBIAN 이미지 설치>


아니면 NOOB에서 Raspbian을 설치 할 수 있는 방법도 있으니 이를 이용해도 된다.


https://www.raspberrypi.org/help/noobs-setup/



2. 라즈베리 접속하기


RASPBIAN이 정상 설치된 SDCard를 라즈 베리파이에 꽂은 후 전원 케이블을 연결하면 보드에 불이 들어오고 초록색 불이 깜빡거리면서 뭔가 시작하는 모습을 보인다. 만약, USB 키보드와 HDMI로 연결된 모니터가 있다면 리눅스 부팅 화면과 함께 로그인 화면을 볼 수 있다. 아무것도 안보이거나 처음 전원을 넣었을 때 초록색 불빛이 깜빡거리지 않는다면 뭔가 잘못된 거라고 볼 수 있으니 다시 설치해야 한다.


그림 <라즈베리 파이 정상 동작 화면>


RASPBIAN의 기본적인 로그인 정보는 ID: pi, 비밀번호: raspberry 를 입력하면 라즈베리 파이에 정상 로그인 되는 것을 볼 수 있다.



3. 라즈베리에 모니터 없이 접속하기


만약 라즈베리 파이를 모니터 없이 사용하려면 어떻게 할까?


라즈베리 파이는 GPIO를 제공하고 RASPBIAN은 GPIO의 UART 통신 포트를 console 접속을 할 수 있도록 구성되어 있다.


그림 <라즈베리 파이 모델 A, B의 GPIO Pinout>



그림 <라즈베리 파이 모델 B+, 2의 GPIO Pinout>


라즈베리 파이 A,B의 경우 B+ 보다 PIN이 적지만 기능상으로 PIN14번 15번이 각각 TX(수신), RX(송신)로 매핑되어 있는 것은 동일하다.

약간 혼동이 올 수 있는게 물리적인 Pinout이 아닌 GPIO의 번호라는 것을 참고 하기 바란다.


그림 <라즈베리 파이 물리적 Pinout>


http://pi.gadgetoid.com/pinout 에 각 Pin별 기능을 interactive GUI로 확인 해 볼 수 있다.



어쨌든, 라즈베리 파이와 PC는 Serial 포트로 연결해야 하는데 라즈베리 파이의 경우 3.3V CMOS 레벨 Serial을 사용하고 있으므로 다음과 같이 몇 가지 단계를 거쳐서 PC와 연결한다.


Raspberry PI GPIO Port <==> Level Converter <==> PC용 UART USB (또는 RS232C 시리얼 포트) 


위 연결 케이블을 직접 만들 수도 있겠으나 그냥 라즈베리 파이용 USB Debugging Cable을 사는게 정신 건강에 좋다.


http://neoze.co.kr/detail.php?docu_idx=10041&mdl_code=004&sml_code=002


그림 <라즈베리 파이 USB-Seria Debugging Cable>


이 제품은 PL-2303 계열 Controller를 사용한 제품인데 Windows에서 사용하려면 별도 드라이버를 설치해야 한다.


대부분의 제품이 이 Chip을 사용하는 것으로 알고 있으며, 제조사 홈페이지에서 받을 수 있다.


이 라즈베리 파이 디버깅 케이블은 총 4개의 선이 나와 있는데 그 내용은 다음과 같다.


빨간색: VCC(5V), 검은색: Ground, 흰색: RX(수신), 녹색: TX(송신)


각 케이블은 PC 입장에서 의미 이므로 라즈베리 파이의 TX에 흰색 케이블(RX)를, 라즈베리 파이 RX에 녹색 케이블(TX)을 연결한다.

그리고, 검정색은 Ground로 빨간색은 5V 전원을 공급 포트에 연결한다.


그림 <라즈베리 파이 Serial 연결 예시>


케이블 연결에 주의할 점이 있는데, 반드시 기존 USB 전원을 제거하고 디버깅 케이블의 전원을 연결해야 전원 충돌이 발생하지 않는다.

기존 전원을 그대로 사용하고 싶다면 USB 전원인 빨간 케이블을 라즈베리파이에서 빼 놓아야 한다.


참고로, 일부 USB Serial 연결 Board의 경우 기존 USB 전원을 사용하도록 switch로 옵션을 제공하는 경우도 있다.


http://www.eleparts.co.kr/EPX8N7KL


케이블 연결을 완료하면 Baudrate 115200으로 연결하면 정상적인 시리얼 통신을 할 수 있다.



4. MacOS에서 라즈베리에 Serial 접속하기


MacOS의 경우 내장 Terminal에서 명령어인 screen으로 접속이 가능하다.

USB Serial 케이블을 연결하면 케이블에 할당된 device의 driver를 확인해야 한다.

$ ls /dev/tty.* 명령으로 확인 해 볼 수 있는데 /dev/tty.usbserial 또는 /dev/tty.usbserial-XXXXX 와 같이 로딩된 driver 가 표시된다.


케이블을 연결 전후 내용을 확인하여 driver 이름을 확인 할 수 있다. 

만약 /dev/tty.usbserial 이란 이름으로 driver가 로딩 된 경우라면 다음과 같은 명령을 입력한다.


$ screen /dev/tty.usbserial 115200



그림 <MacOS screen 화면>


screen 화면을 연결을 끊으려면 control + A + K를 누른 후 y를 입력한다. screen 명령에 대한 자세한 설명은 다음 링크를 참고 한다.


http://ss64.com/osx/screen.html



Windows의 경우 PuTTY를 이용하면 된다.


http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html


그림 <Windows 7 장치 관리자 COM 포트 할당 화면>



그림 <PuTTY 설정 화면>



그림 <PuTTY 접속 화면>



4. 라즈베리 파이 SSH 접속하기


GPIO 시리얼 통신이 아닌 경우 SSH를 이용해도 라즈베리 접속 할 수 있다. 단, IP를 알아야 하는데 시리얼로 로그인 후 다음 명령으로 확인 해볼 수 있다.


ifconfig


라즈베리 파이에게 할당된 IP가 192.168.0.6이라면 다음과 같이 SSH를 이용하여 로그인을 해 볼 수 있다.


그림 <SSH를 이용한 라즈베리 파이 정상 로그인 화면>


윈도우즈 환경의 경우 PuTTY를 설치하면 라즈베리 파이로 SSH 접속을 할 수 있다.


Trackback 0 Comment 0
2014.08.12 11:21

Swift - Closures


Closures

클로져는 사용자 코드에서 다른 코드나 함수로 전달 될 수도 있고, 또 그 자체가 사용되어 질 수 있는 기능에 대한 자립적인 블럭을 말한다.

또한, 클로저에는 클로저가 정의된 곳의 context로 부터 상수나 변수에 대한 reference를 수집(capture)하거나 저장(store) 가능한데 이를 두고 변수나 상수를 closing한다라는 표현을 사용하기에 closures라는 이름으로 불린다.


reference capturing 에 대한 부분은 별도로 설명하고 있으나 간략하게 정리하면, 클로저가 해당 변수나 상수를 지속적으로 참고하고 있으며, 변수일 경우 해당 정보의 변경에 대한 정보를 지속적으로 얻을 수 있는 것을 말한다.


Global 함수와 nested 함수가 closure에 대한 특별한 모습이라 할 수 있으며, 클로져는 다음 세 가지 중 하나의 모습을 갖게 된다.

  • Global 함수는 이름을 갖고 어떠한 값도 수집하지 않는 클로져이다
  • Nested 함수는 이름을 가지고 해당 함수를 포함하는 함수의 값을 수집 할 수 있는 클로져이다
  • 클로져 expression은 이름이 없는 클로져로, 해당 클로져를 포함하는 context의 값을 수집 할 수 있도록 간략한 형태이다

Closures Expressions

Closure Expressions은 syntax를 중점으로 inline closure를 간략하게 작성하는 방법을 말한다.
Closure Expressions은 명료함과 의도에 대한 손실 없이 클로저를 가장 단순화 할 수 있는 몇몇의 최적화 syntax를 제공한다.

Closure Expression을 잘 설명하기 위해 sorted 함수를 먼저 소개를 한다.
  • The Sorted Function
    • Swift 표준 라이브러리에는 sorted라는 이름의 함수를 제공한다
    • 이는 프로그래머가 제공한 클로저 함수의 결과를 기준으로 주어진 타입의 Array의 값을 정렬 해 주는 함수이다.
    • 호출이 완료되면 sorted 함수는 기존 입력했던 Array와 동일한 타입과 크기의 정렬된 array를 생성하며 원본은 변하지 않는다.
    • sorted 함수는 다음 두 가지 정보를 argument로 입력 받는다
      • 알고 있는 타입 값의 Array
      • Array 에 담고 있는 값의 타입과 동일한 타입 두 개를 argument로 그리고 리턴 타입으로 앞서 입력 받은 타입을 비교하여 그 결과에 대해 true 또는 false를 리터하는 클로저 타입
    • 예를 들어 문자열 Arrary라면 다음과 같다
      • let names = ["Hello", "World", "Swift", "Programming"]
    • 이럴 경우 클로져 타입은 (String, String) -> Bool 이 되고
      • func backwards(s1: String, s2: String) -> Bool {
      •   return s1 > s2
      • }
      • var reversed = sorted(names, backwards)

이제 Closure Expression 에 대해 자세히 설명하겠다
  • Closure Expression Syntax
    • Closure Expression Syntax는 다음과 같다
    • { ( 파라메터 ) -> 리턴타입 in
    •     내용
    • }
    • Closure Expression에서는 Parameter로 상수, 변수, inout을 사용 할 수 있다. 그러나, default 값은 사용 할 수 없으며 Variadic 타입의 경우 이름을 붙여 Parameter의 제일 마지막 부분에만 사용하는 경우만 사용이 가능하다
    • 앞서 sorted 함수에서 사용했던 backwards 함수를 Closure Expression으로 표현하면 다음과 같다.
      • var reversed = sorted(names, {
      •   (s1: String, s2: String) -> Bool in
      •   return s1 > s2
      • }
    • 이 inline closure의 파라메터와 리턴타입 선언부는 backwards 함수의 것과 동일하지만 함수와 달리 괄호 문자로 ('{') 둘러 싸여 있다는 차이가 있다.
    • inline closure는 in 이라는 키워드를 기준으로 in 이전에는 파라메터 및 리턴타입을, 이후에는 본문을 구분된다
    • 본문 내용이 그리 길지 않은 경우 다음과 같이 한 줄로 줄여서 사용 할 수도 있다
      • var reversed = sorted(names, {(s1: String, s2:String) -> Bool in return s1 > s2 })
  • Inferring Type From Context
    • sorted 함수의 경우 Closure로 넘기는 parameter의 타입으로 부터 closure의 타입을 짐작할 수 있다.
    • 앞의 예제의 경우 String Array 를 전달하게되므로 Closure 타입은 (String, String) -> Bool 이며 이를 closure expression에서는 궂이 지정할 필요는 없다
      • var reversed = sorted(names, {(s1, s2) in return s1 > s2})
  • Implicit Returns from Single-Expression Closures
    • Single-Expression Closures는 return 키워드를 생략해도 그 실행 결과가 return을 의미한다고 본다
      • var reversed = sorted(names, {(s1, s2) in s1 > s2})
    • 위의 경우는 하나의 expression ( single-expression )은 s1 > s2 이며 그 결과가 Bool 이므로 명확하게 return 값으로 처리하게 된다
  • Shorthand Argument Names
    • Swift는 inline closure에 대해 별도의 명시가 없는 경우 그 순서에 따라 $0, $1 와 같이 자동으로 shorthand argument 이름을 제공한다. 따라서, 별도의 argument를 지정하지 않는다 해도 이를 이용해서 closure를 구성 할 수 있다.
      • var reversed = sorted(names, { $0 > $1 })
      • 여기서 $0은 closure의 첫 번째 String 타입 parameter, $1는 두 번째 String 타입 parameter를 의미한다
  • Operator Functions
    • Swift에서는 앞서 예제를 가장 짧게 줄일 수 있는 방법을 제공하는데 바로 Operator Function 이다.
    • Swift는 두 개의 String 타입 Parameter와 Bool 타입의 리턴타입을 가지는 함수로 greater-than operator ( > )에 대한 구현을 정의 해 놓고 있다
    • 이는 위의 sorted 함수의 예제에 사용된 closure 타입과 정확하게 일치하므로 그냥 단순하게 greater-than operator를 closure 자리에 대치 할 수도 있다
      • var reversed = sorted(names, > )
    • 자세한 내용은 별도의 Operator Functions 항목에 자세히 설명되어 있음

Trailing Closures Expressions

closure expression을 함수의 마지막 argument로 전달하고 그 expression이 길어질 때 trailing closure라는 방식으로 작성하면 유용할 수 있다.
Training closure는 이를 지원하는 함수의 괄호 ('()') 바깥쪽 (그리고 바로 직후)에 쓰는 closure expression이다.
  • 다음과 같이 closure를 입력 받는 함수를 정의한다면
    • func test(closure:()->()) {
    •   // 본문
    • }
  • trailing closure를 사용하지 않는 호출하는 경우는 다음과 같고
    • test({
    •   // closure 본문
    • })
  • trailing closure를 사용하면 다음과 같이 호출 함수의 괄호 바깥에 놓을 수 있다
    • test() {
    •   // closure 본문
    • }
  • sorted의 예제 중 shorthanded argument를 적용해 보면 다음과 같이 줄여서 사용이 가능하다
    • var reversed = sorted(name) { $0 > $1 }

trailing closure는 single-line으로 표현하기 어려운 긴 closure를 표현할 때 가장 유용하다. Array의 map과 같은 method는 argument로 하나의 closure를 입력받는데, 해당 closure에 Array Item을 하나씩 넘겨주고, closure에서 mapping 된 새로운 정보를 리턴받는다. 이 때 기존 Array와 동일한 순서를 갖지만 새롭게 mapping된 값을 갖는 새로운 Array가 생성된다. 

  • let numstr = [1, 2, 3].map {
  •   (var num) -> String in  String(num)
  • }


    '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.08.11 17:00

    Swift - Function

    Defining and Calling Functions
      • 기본적인 함수 정의는 다음과 같다
        • func 함수이름 ( 인자 정보 ) -> 리턴타입
        • 인자 정보는 이름:타입 형태를 따른다
          • func test (param1: String) -> String
      • 정의된 함수의 호출은 다음과 같다
        • test("Hello")

      Function Parameters and Return Values

      • Multiple Input Parameters
        • 인자 정보에 comma 문자 (',')를 이용하여 여러 인자를 입력 받을 수 있다
          • func test (param1: String, param2: Int) -> String
        • 해당 함수에 대한 호출은 다음과 같다
          • test("Hello", 100)
      • Functions Without Parameters
        • 다음과 같이 인자 정보를 기입하지 않는다
          • func test () -> String
      • Functions Without Return Values
        • 다음과 같이 return 정보를 기입하지 않는다
          • func test (param1: String)
      • Functions with Multiple Return Values
        • 리턴 타입 정의에 Tuple 타입으로 정의한다
          • func test (param1: String) -> (ret1: String, ret2: String)
      • Optional Tuple Return Types
        • 리턴 값에 대한 존재 여부가 불확실한 경우 return 타입에 Question 문자 ('?')를 붙여 optional로 정의한다
          • func test (param1: String) -> String?

      Function Parameter Names
        • External Parameter Names
          • Swift 함수는 같이 Objective C에서와 같이 함수 인자 이름을 노출하여 함수 인자에 대한 가독성을 높일 수 있다
            • func test(name s1: String, withFamilyName s2: String) 
          • 외부로 인자 이름을 노출하면 호출할 때 다음과 같이 해당 이름과 함께 호출 해야 한다
            • test(name: "JeongSeok", withFamilyName: "Hong")
        • Shorthand External Parameter Names
          • 외부로 노출되는 인자 이름과 내부에서 사용하는 이름이 동일한 경우 궂이 똑같은 이름을 동일하게 작성 할 필요 없이 내부에는 sharp 문자 ('#')를 앞에 붙여서 정의한다
            • func test(#name: String)
        • Default Parameter Values
          • 함수 정의 시 default 값을 가진 인자는 호출 시 값을 정의하지 않는 경우 default로 정의된 값을 사용할 수 있다
          • 함수 인자 중간에 default 값이 있는 경우 해당 값을 지정하지 않을 수 있으나 함수에 정의된 인자의 순서는 지켜져야 한다
        • External Names for Parameters with Default Value
          • 기본값을 가지는 인자에 대해서는 자동으로 외부 이름으로 노출이 된다
        • Variadic Parameters
          • 가변 함수 인자는 특정 타입에 대해서 0 또는 그 이상을 받아드릴 수 있도록 정의할 수 있다.
          • 특정 타입 정보 이후 three period 문자 ("...")를 두어 해당 인자가 Variadic임을 표시한다
            • Double...
            • Int...
          • 다른 타입의 인자와 함께 사용 할 수도 있으나 혼란을 방지하기 위해 Variad제일 마지막에 놓여야 정상적으로 인식된다
        • Constant and Variable Parameters
          • 함수에 사용되는 인자는 기본으로 상수로 선언되므로 해당 값을 변경 시 컴파일 오류를 발생한다
          • 그러나 새로운 변수를 할당하지 않고 변수로 사용하는게 편리할 때가 있으므로 인자 값에 var 키워드를 두는 방법을 이용 할 수 있다
            • func test(var name: String)
        • In-Out Parameters
          • 변수로 활용되는 함수 인자는 실제 복사가 되므로 함수 호출에 사용된 정보와 내부에서 사용하는 정보는 같은 값을 가졌으나 다른 정보라고 볼 수 있다
          • 그러나 C나 JavaScript에서와 같이 필요에 따라서 함수 인자로 넘겨진 정보 자체를 변경해야 더 효율적인 경우가 있다
          • 이를 위해 Swift에서는 inout 키워드를 제공한다. 참고로. inout 키워드로 선언된 인자는 var나 let이 될 수 없다
            • func test(inout name: String)
          • 그리고 input을 인자로 가진 함수는 C 언어와 유사하게 ampersand 문자 ('&')를 인자값에 같이 전달한다
            • func test(&name)

        Function Types

        Swift에서는 모든 함수에도 각각의 함수 타입을 정의 할 수 있다.
        함수 타입은 함수 인자 타입과 리턴 타입으로 구성되어 있다.
        • func test(name: String, age: Int) -> String
        이럴 경우 함수 타입은 다음과 같다
        • (String, Int) -> String
        • Using Function Types
          • 함수 타입은 변수나 상수로 선언하여 사용 할 수 있다
            • var testFunc: (String, Int) -> String = test
          • 함수 호출은 일반 함수와 동일하게 사용한다
            • testFunc("Hello", 100)
        • Function Types as Parameter Types
          • 함수 타입을 다른 함수의 인자 함수 타입으로 지정 할 수도 있다
            • func testWithFunc ( testFunc : (String, Int) -> Int, name: String, num : Int)
        • Function Types as Return Types
          • 함수 타입을 다른 함수의 리턴 타입으로 지정 하여 사용 할 수 있다
            • func testAsReturnFunc ( name: String, num: Int) -> (String, Int)-> Int
        • Nested Function
          • 함수 내부에 새로운 함수하여 global 함수가 아닌 내부 함수로서 사용하는 방식을 제공한다
          • func testAsReturnFunc ( name : String, num: Int ) -> (String, Int) -> Int {
          •     func innerFuncA(name: String, age: Int) -> Int {
          •     ...
          •     }
          •     ...
          • }


        '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.08.11 15:19

        Swift - Control Flow

        For Loops
        • for-in
        • for-condition-increment

        While Loops
        • while
        • do-while

        Conditional Statements
        • if
          • else
          • if else
        • switch
          • case
            • switch에 넘겨진 값에 대한 경우 (case)를 정의한다
            • C 언어에서 같이 명시적으로 해당 case에 대한 break를 쓰지 않아도 된다
              • case A:
              •   handle it for A
              • case B:
              •   handle it for B
            • 여러 case에 해당하는 경우 comma (',')로 연결된 형태로 정의한다
              • case A, B:
              •   handle it for A or B
            • Case에 Range 타입을 입력 할 수 있음
              • case 1...3:
            • Switch 타입이 Tuple인 경우도 처리할 수 있다
              • case (A, B):
              • case (1...3, 5...10):
          • case-where
            • 기본적인 case 조건에 where라는 별도 조건을 추가 할 수 있다
              • case let (x, y) where x == y:
          • default
            • case로 정의되지 않은 부분을 처리한다
            • Swift에서는 switch 문 사용 시 case 를 꽤 철저히 하도록 강제하고 있다
            • 따라서, 명확하게 case를 작성하지 않을 때에는 default를 작성해야 한다
            • default의 경우 적어도 실행 가능한 statement를 문을 작성해야 XCode에서 오류 표시가 되지 않는다.
            • 좀 귀찮기는 하지만 default에서 별다른 동작을 하지 않는다 하더라도 break를 써 준다

        Control Transfer Statements
            • continue
            • break
            • fallthrough
              • Swift는 C언어와 달리 switch 문에서 궂이 break를 써서 case를 구분하지 않는다
              • 따라서, C언어와 같이 case 내부의 실행 조건에 따라 아래 case로 흐름을 넘기기 위해 fallthrough라는 statement가 추가되어 있다
            • return

          Labeled Statements
            • switch나 일반적인 loop 문은 같이 중첩해서 사용 할 수 있다.
            • switch나  loop 문에서 앞에 colon 문자 (':')과 함께 label을 지정하고, 이후 break나 continue statement 문 뒤에 앞서 지정한 label 이름을 지정하면 해당 label로 지정된 statement에 대해 break 또는 continue 동작을 수행한다.


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

            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
            Swift - Operators  (0) 2014.08.08
            Trackback 0 Comment 0
            2014.08.08 19:01

            Swift - Data Type #Collections

            Array
            • Array에 대한 타입은 Array<SomeType> 형태로 선언한다
            • 그러나 간략하게 [SomeType] 형태로 쓸 수 있다
            • 문자열에 대한 Array
              • var list: [String] = ["A", "B", "C"]
            • 당연한 이야기지만 let을 이용하는 경우 상수가 되며 편집 불가 (immutable) 상태가 된다
            • 같은 Type의 Array는 서로 병합이 가능하다
              • list += ["d", "e"] + ["f"] 

            Array 초기화
            • Array를 생성 시 Type 정보화 함께 초기화를 할 수 있다
              • var someInts = [Int]()
            • 이렇게 선언할 경우 item count가 0인 정수형 Array가 생성된다
            • 동일한 형태로 다음과 같이 선언 할 수도 있다
              • var someInts:[Int] = []
            • Array 타입은 특정 크기와 값으로 초기화 하는 기능도 제공한다
              • var threes = [Int](count:3, repeatedValue: 1)
            • 이럴 경우 1로 3개의 item을 가진 정수형 Array가 생성된다

            Dictionary
            • Dictionary에 대한 타입은 Dictionary<KeyType, ValueType> 형태로 선언한다
            • 그러나 간략하게는 [KeyType: ValueType]으로 쓸 수 있다
              • var dict:[String: String] = ["ICN":"Incheon Airport", "LAX":"Los Angeles"]
              • var airports = ["ICN":"Incheon Airport", "LAX":"Los Angeles"]

            Dictionary를 이용한 반복문
            • Dictionary는 Array와 같이 for-in 문과 같이 사용 할 수 있고 각 Item에 대해 (key, value) 형태를 쓸 수 있다.
              • for (code, name) in airports {
              •     println("\(code):\(name)")
              • }
            • key 또는 value만 둘 중 하나만 사용한다면 Underscore ('_') 를 정의해서 사용 할 수도 있으며
              • for (code, _) in airports {
              • }
            • keys, values와 같이 별도 property를 이용할 수도 있다.
              • for code in airports.keys 
              • for name in airports.values

            Dictionary 초기화
            • Dictionary를 생성 시 타입 정보와 함께 생성 할 수 있다
              • var namesOfInts = [Int: String]()
            • 생성된 dictionary를 모두 없애는 경우 다음과 같이 표현할 수 있다
              •  namesOfInts = [:]
            • Dictionary의 KeyType으로 사용되려면 해당 타입은 Hashable 프로토콜을 따라야 한다
            • 참고로, Swift에서 제공하는 모든 기본 타입 (String, Int, Double 등)은 모두 Hashable 이다.
            • Hashable은 hasValue property를 가지고 있으니 custom type을 생성할 경우 이를 주의해야 한다


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

            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
            Swift - Operators  (0) 2014.08.08
            Swift - Data Type #Tuple  (0) 2014.08.08
            Trackback 0 Comment 0
            2014.08.08 18:03

            Swift - String

            Objective-C NSString과 호환
            • Swift String은 Objective-C NSString과 seamless 하게 동작하도록 연결되어 있음
            • 따라서, NSString에서 제공하던 API가 Swift String에서도 동일하게 제공됨

            문자열 초기화
            • literal 로 초기화
              • var emptyString = ""
            • Type initializer로 초기화
              • var emptyString = String()


            문자열 편집
            • 변수로 선언된 경우 따옴표로 묶여있는 문자열 또는 다른 문자열 변수/상수를 할당

            Value 타입의 문자열
            • 기본적으로 String 타입은 Value 타입으로 함수나 메소드에 전달되나 새로운 변수, 상수에 할당 될 때 그 값이 복사가 된다
            • 실제 Swift 내부적으로는 실행 시 필요한 경우에만 복사를 한다고 한다 (성능 관련)

            Character 타입과 관계
            • String은 Character의 조합으로 구성되어 있다
            • String과 Character를 붙일 경우 이를 String에 다시 할당 할 수 있다

            let ch:Character = "A"

            let str:String = "Hello"

            let ch_str = str + ch     // "HelloA"


            String Interpolation
            • 문자열 중간에 Escape를 두어 상수나 변수를 문자열과 조합 할 수 있는 기능

            let ch:Character = "A"

            let str:String = "Hello \(A)" // "Hello A"


            Unicode
            • 21 bits Unicode scalar를 사용
            • LATIN SMALL LETTER A는 U+0061 (a)와 같다
            • 특수 문자로 \0 (null) , \\ (backslash) , \t (horizontal tab), \n (line feed), \r (carriage return), \" (double quote), \' (single quote)이 있다
            • 숫자로 표현하는 경우 \u{number} 로 표현하며 1부터 8자리까지의 16진수 값이다

            let dollarSign = "\u{24}" 


            Extended Grapheme Clusters
            • extended grapheme cluster는 하나 또는 연속되 Unicode Scalar의 묶음으로 조합되었을 때 사람이 읽을 수 있는 문자가 되는 구성을 말한다
            • 예를 들어 "한" 이라는 글자는 U+D55C 이며, 이 글자는 ㅎ(U+1112, 초성), ㅏ(U+1161, 중성), ㄴ(U+11AB, 종성)으로 구성되어 있다
            • Swift String에서 다음과 같이 문자열을 구성하면 "\u{1112}\u{1161}\u{11AB}"가 되며 이 문자열이 화면에 표시되는 경우 "한" 으로 표시된다.
            • 같은 글자로 표시되고 하나의 Charactor 로 생성되며 비교시 동일하게 인식하다고 했지만 실제 실행해 보면 그런것으로 보이지는 않는다. 이부분은 좀 더 확인이 필요할 것 같다

            Unicode 표현
            • Swift 문자열는 자기가 가지고 있는 Character를 표현하는 property를 제공한다
            • utf8 : UTF-8 코드
            • utf16 :UTF-16 코드
            • unicodeScalars : 21bit Unicode Scalar로 UTF-32와 동일


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

            Swift - Control Flow  (0) 2014.08.11
            Swift - Data Type #Collections  (0) 2014.08.08
            Swift - String  (0) 2014.08.08
            Swift - Operators  (0) 2014.08.08
            Swift - Data Type #Tuple  (0) 2014.08.08
            Swift - Data Type #Optionals  (0) 2014.08.08
            Trackback 0 Comment 0
            2014.08.08 17:28

            Swift - Operators

            비교 Operator
            • Equal : ( a == b)
            • Not Equal : ( a != b )
            • Greater Than : ( a > b )
            • Less Than : ( a < b )
            • Greater than or equal to : ( a >= b )
            • Less than or equal to : ( a <= b )

            Ternary Condition Operator
            • 세 부분을 되어 있는 조건문
            • question ? answer1 : answer2

            Nil Coalescing Operator
            • ( a ?? b) 의 형태로 사용되며 a는 optional 값으로 a의 값이 있는 경우 a의 unwrapped optional으로 전달하며 없는 경우는 default 값으로써 b를 전달한다
            • 따라서 ( a ?? b ) 구문은 다음과 동일한 동작을 수행한다
              • a != nil ? a! : b
            • 만약 a 가 nil 이 아닌 경우 b는 수행되지 않는 short-circuit evaluation으로 수행된다

            Closed Range Operator
            • ( a ... b) 의 형태로 사용되며 a 부터 b까지 실행을 말한다
            • a는 b보다 크면 안된다.
            • for-in 과 같은 반복문에서 주로 사용된다

            for index in 1...5 {

              println ("\(index) x 5 is \(index * 5)") // 5회 호출

            }


            Half-Open Range Operator
            • ( a ..< b) 의 형태로 사용되며 a 부터 b까지 실행을 하지만 b는 포함하지 않는다

            for index in 1..<5 {

              println ("\(index) x 5 is \(index * 5)") // 4회 호출

            }


            논리 Operator
            • NOT : ( !a )
            • AND : ( a && b )
            • OR : ( a || b )

            Cast Operator
            • Type check : is
            • Type cast : as


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

            Swift - Data Type #Collections  (0) 2014.08.08
            Swift - String  (0) 2014.08.08
            Swift - Operators  (0) 2014.08.08
            Swift - Data Type #Tuple  (0) 2014.08.08
            Swift - Data Type #Optionals  (0) 2014.08.08
            Swift - Data Type #General  (0) 2014.08.08
            Trackback 0 Comment 0
            2014.08.08 17:02

            Swift - Data Type #Tuple

            Tuples
            • 여러개의 값을 하나로 묶은 그룹을 말함
            • Tuple에 들어가는 값은 어떤 타입도 가능하며, 각각 같은 타입일 필요도 없음
            • 괄호로 둘러싸이며 콤마로 구분된다
            • 예를 들어 let A = (404, "Not Found")로 선언하면 이는 (Int, String) 의 Tuple 타입으로 선언된 것이다
            • A 를 전달 받을 B를 변수로 선언한다면 다음과 같이 선언한다
              • var B:(Int, String) = A
            • 튜플를 다시 분리하려면 다음과 같이 변수이름으로 나눠서 선언해야 한다
              • let (C, D) = A
            • 사용하지 않는 항목이라면 Underscore로 표현하여 무시한다
              • let (C, _) = A
            • 아니면 그룹으로 묶어진 순서대로 dot 문자와 인덱스 숫자로 선언할 수 있다
              • let C = A.0, D= A.1
            • 또는, Tuple 생성 시 각 항목의 이름을 다음과 같이 할당해서 사용 할 수도 있다.
              • let A = (code: 404, message: "Not Found")
              • let C = A.code, D = A.message


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

            Swift - String  (0) 2014.08.08
            Swift - Operators  (0) 2014.08.08
            Swift - Data Type #Tuple  (0) 2014.08.08
            Swift - Data Type #Optionals  (0) 2014.08.08
            Swift - Data Type #General  (0) 2014.08.08
            Swift - General  (0) 2014.08.08
            Trackback 0 Comment 0