'2017/05'에 해당되는 글 9건

  1. 2017.05.29 조건문
  2. 2017.05.25 함수 (2)
  3. 2017.05.24 Perfect 라우팅
  4. 2017.05.22 컬렉션 타입
  5. 2017.05.18 데이터 타입
  6. 2017.05.17 Perfect 시작하기
  7. 2017.05.15 상수와 변수
  8. 2017.05.11 이름짓기, 콘솔로그, 문자열 보간법
  9. 2017.05.08 스위프트 시작하기

조건문

Swift/기본문법 2017.05.29 11:00

조건문

  • if-else
  • switch

소스코드


if-else 구문

if-else 구문의 기본 형태

if만 단독적으로 사용해도 되고, else if, else와 조합해서 사용 가능합니다. if 뒤의 조건 값에는 Bool 타입의 값만 위치해야 하며, 조건 값을 감싸는 소괄호는 선택사항입니다.

if 조건 {
    조건
} else if 조건 {
    /* 실행 구문 */
} else {
    /* 실행 구문 */
}


if-else의 사용

let someInteger = 100

if someInteger < 100 {
    print("100 미만")
} else if someInteger > 100 {
    print("100 초과")
} else {
    print("100")
} // 100

// 스위프트의 조건에는 항상 Bool 타입이 들어와야합니다
// someInteger는 Bool 타입이 아닌 Int 타입이기 때문에
// 컴파일 오류가 발생합니다
//if someInteger { }


switch 구문

스위프트의 switch 구문은 다른 언어에 비해 굉장히 강력한 힘을 발휘합니다. 기본적으로 사용하던 정수타입의 값만 비교하는 것이 아니라 대부분의 스위프트 기본 타입을 지원하며, 다양한 패턴과도 응용이 가능합니다. 스위프트의 다양한 패턴은 Swift Programming Language Reference의 패턴에서 확인할 수 있습니다.


  • 각각의 case 내부에는 실행가능한 코드가 반드시 위치해야 합니다
  • 매우 한정적인 값(ex. enum의 case 등)이 비교값이 아닌 한 default 구문은 반드시 작성해야 합니다
  • 명시적 break를 하지 않아도 자동으로 case마다 break 됩니다  
  • fallthrough 키워드를 사용하여 break를 무시할 수 있습니다
  • 쉼표(,)를 사용하여 하나의 case에 여러 패턴을 명시할 수 있습니다


switch 구문의 기본 형태

switch 비교값 {
case 패턴:
    /* 실행 구문 */
default:
    /* 실행 구문 */
}

switch 구문의 사용

// 범위 연산자를 활용하면 더욱 쉽고 유용합니다
switch someInteger {
case 0:
    print("zero")
case 1..<100:
    print("1~99")
case 100:
    print("100")
case 101...Int.max:
    print("over 100")
default:
    print("unknown")
} // 100

// 정수 외의 대부분의 기본 타입을 사용할 수 있습니다
switch "yagom" {
case "jake":
    print("jake")
case "mina":
    print("mina")
case "yagom":
    print("yagom!!")
default:
    print("unknown")
} // yagom!!


기본 문법을 익힌 뒤 차후에 더 많은 switch 구문과 패턴의 활용에 대해 알아봅시다


관련문서

The Swift Programming Language - Control Flow





by yagom

facebook : http://www.facebook.com/yagomSoft

facebook group : https://www.facebook.com/groups/yagom/


p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓ 블로거에게 공감은 큰 힘이 됩니다 ↓↓↓ 

저작자 표시 비영리 변경 금지
신고

'Swift > 기본문법' 카테고리의 다른 글

옵셔널  (0) 2017.06.05
반복문  (0) 2017.06.01
조건문  (0) 2017.05.29
함수  (2) 2017.05.25
컬렉션 타입  (0) 2017.05.22
데이터 타입  (0) 2017.05.18
Posted by yagom

함수

Swift/기본문법 2017.05.25 11:00

함수



소스코드


함수의 선언

함수선언의 기본형태

func 함수이름(매개변수1이름: 매개변수1타입, 매개변수2이름: 매개변수2타입 ...) -> 반환타입 {
    /* 함수 구현부 */
    return 반환값
}

// 예)
// sum이라는 이름을 가지고 
// a와 b라는 Int 타입의 매개변수를 가지며 
// Int 타입의 값을 반환하는 함수
func sum(a: Int, b: Int) -> Int {
    return a + b
}


반환 값이 없는 함수

func 함수이름(매개변수1이름: 매개변수1타입, 매개변수2이름: 매개변수2타입 ...) -> Void {
    /* 함수 구현부 */
    return
}

// 예)
func printMyName(name: String) -> Void {
    print(name)
}

// 반환 값이 없는 경우, 반환 타입(Void)을 생략해 줄 수 있습니다
func printYourName(name: String) {
    print(name)
}

매개변수가 없는 함수

func 함수이름() -> 반환타입 {
    /* 함수 구현부 */
    return 반환값
}

// 예)
func maximumIntegerValue() -> Int {
    return Int.max
}


매개변수와 반환값이 없는 함수

func 함수이름() -> Void {
    /* 함수 구현부 */
    return
}

// 함수 구현이 짧은 경우
// 가독성을 해치지 않는 범위에서
// 줄바꿈을 하지 않고 한 줄에 표현해도 무관합니다
func hello() -> Void { print("hello") }


// 반환 값이 없는 경우, 반환 타입(Void)을 생략해 줄 수 있습니다
func 함수이름() {
    /* 함수 구현부 */
    return
}

func bye() { print("bye") }


함수의 호출

sum(a: 3, b: 5) // 8

printMyName(name: "yagom") // yagom

printYourName(name: "hana") // hana

maximumIntegerValue() // Int의 최댓값

hello() // hello

bye() // bye




매개변수 기본 값

매개변수에 기본적으로 전달될 값을 미리 지정할 수 있습니다.

기본값을 갖는 매개변수는 매개변수 목록 중에 뒤쪽에 위치하는 것이 좋습니다.

func 함수이름(매개변수1이름: 매개변수1타입, 매개변수2이름: 매개변수2타입 = 매개변수 기본값 ...) -> 반환타입 {
    /* 함수 구현부 */
    return 반환값
}

func greeting(friend: String, me: String = "yagom") {
    print("Hello \(friend)! I'm \(me)")
}

// 매개변수 기본값을 가지는 매개변수는 호출시 생략할 수 있습니다
greeting(friend: "hana") // Hello hana! I'm yagom
greeting(friend: "john", me: "eric") // Hello john! I'm eric

전달인자 레이블

함수를 호출할 때 함수 사용자의 입장에서 매개변수의 역할을 좀 더 명확하게 표현하고자 할 때 사용합니다.

func 함수이름(전달인자 레이블 매개변수1이름: 매개변수1타입, 전달인자 레이블 매개변수2이름: 매개변수2타입 ...) -> 반환타입 {
    /* 함수 구현부 */
    return
}

// 함수 내부에서 전달인자를 사용할 때에는 매개변수 이름을 사용합니다
func greeting(to friend: String, from me: String) {
    print("Hello \(friend)! I'm \(me)")
}

// 함수를 호출할 때에는 전달인자 레이블을 사용해야 합니다
greeting(to: "hana", from: "yagom") // Hello hana! I'm yagom

가변 매개변수

전달 받을 값의 개수를 알기 어려울 때 사용할 수 있습니다. 가변 매개변수는 함수당 하나만 가질 수 있습니다.

//func 함수이름(매개변수1이름: 매개변수1타입, 전달인자 레이블 매개변수2이름: 매개변수2타입...) -> 반환타입 {
//    /* 함수 구현부 */
//    return
//}

func sayHelloToFriends(me: String, friends: String...) -> String {
    return "Hello \(friends)! I'm \(me)!"
}
print(sayHelloToFriends(me: "yagom", friends: "hana", "eric", "wing"))
// Hello ["hana", "eric", "wing"]! I'm yagom!

print(sayHelloToFriends(me: "yagom"))
// Hello []! I'm yagom!


위에 설명한 함수의 다양한 모양은 모두 섞어서 사용 가능합니다.


데이터 타입으로서의 함수

스위프트는 함수형 프로그래밍 패러다임을 포함하는 다중 패러다임 언어이므로 스위프트의 함수는 일급객체입니다. 그래서 함수를 변수, 상수 등에 할당이 가능하고 매개변수를 통해 전달할 수도 있습니다.


함수의 타입표현

반환타입을 생략할 수 없습니다.

 (매개변수1타입, 매개변수2타입 ...) -> 반환타입


함수타입 사용

var someFunction: (String, String) -> Void = greeting(to:from:)
someFunction("eric", "yagom") // Hello eric! I'm yagom

someFunction = greeting(friend:me:)
someFunction("eric", "yagom") // Hello eric! I'm yagom


// 타입이 다른 함수는 할당할 수 없습니다 - 컴파일 오류 발생
//someFunction = sayHelloToFriends(me: friends:)


func runAnother(function: (String, String) -> Void) {
    function("jenny", "mike")
}

// Hello jenny! I'm mike
runAnother(function: greeting(friend:me:))

// Hello jenny! I'm mike
runAnother(function: someFunction)


참고 : 스위프트의 전반적인 문법에서 띄어쓰기는 신경써야할 때가 많습니다


관련문서

The Swift Programming Language - Functions





by yagom

facebook : http://www.facebook.com/yagomSoft

facebook group : https://www.facebook.com/groups/yagom/


p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓ 블로거에게 공감은 큰 힘이 됩니다 ↓↓↓ 

저작자 표시 비영리 변경 금지
신고

'Swift > 기본문법' 카테고리의 다른 글

반복문  (0) 2017.06.01
조건문  (0) 2017.05.29
함수  (2) 2017.05.25
컬렉션 타입  (0) 2017.05.22
데이터 타입  (0) 2017.05.18
상수와 변수  (0) 2017.05.15
Posted by yagom

Perfect 라우팅

Swift/Perfect 2017.05.24 11:00


Perfect 라우팅

1. Routes 
2. HTTP Method, URI 지정 
3. 
Web Root 디렉터리 설정
4. JSON 응답



지난 번에는 Perfect 서버 애플리케이션을 처음 구동해 보았습니다. 

2017/05/17 - [Swift/Perfect] - Perfect 시작하기

이번에는 라우팅 하는 방법에 대해서 알아보려고 합니다 :)


* 참고 *

2017년 5월 현재 Swift 3 / Perfect 최신버전 2.0.x 환경에서 진행함을 알려드립니다.

* Swift 최신 버전 확인

* Perfect 최신 버전 확인


Routes

HTTP 요청에 의해 여러 메서드, URI에 따른 동작을 처리하려면 Routes라는 구조체를 사용합니다.

지난 번 main.swift파일에 서버 포트를 지정해 주었던 server.serverPort = 8080 코드 아래에 routes 변수에 Routes 인스턴스를 하나 할당해줍니다.

var routes = Routes()


HTTP Method, URI 지정

Routes인스턴스를 생성할 때, 원하는 HTTP Method와 URI를 지정할 수 있으며, 요청이 온 경우 handler 클로저를 통해 요청을 처리합니다. 이후, addRoutes() 메서드를 통해 서버에 라우트 정보를 추가해줍니다.

routes.add(method: .get, uri: "/blog", handler: { request, response in
	response.setBody(string: "Blog handler was called")
	response.completed()
})
server.addRoutes(routes)

이렇게 지정하고 실행하면 8080포트blog 경로를 지정하여 요청하면 "Handler was called" 문자열이 돌아오게 될 것입니다.


handler 클로저의 내부에서 request 인스턴스에서 param(name:) 등 많은 메서드를 통해 HTTP 요청 정보를 읽어낼 수도 있습니다. 
routes.add(method: .get, uri: "/blog", handler: { request, response in
    
    let pageToResponse: Int
    
    if let page = request.param(name: "page"), let pageNumber = Int(page) {
        pageToResponse = pageNumber
    } else {
        pageToResponse = 0
    }
    
    response.setBody(string: "Handler was called page number:  \(pageToResponse)")
    response.completed()
})


Web Root 디렉터리 설정

연습을 해봤으니 실질적으로 HTML 응답과 JSON 응답을 해보려합니다. 먼저 웹의 데이터를 모아 둘 WebDocuments 폴더를 사용자 디렉터리의 하위폴더로 생성해줍니다.
> mkdir ~/WebDocuments

WebDocuments 폴더를 생성하면 블로그 메인페이지로 사용할 index.html 파일을 넣어줍니다. (파일을 이동하거나 복사하는 방법에 대해서는 따로 설명하지 않겠습니다... 'ㅁ')

이제 WebDocuments 폴더를 웹서버의 Root 폴더로 지정합니다. 

사용자 디렉터리의 주소를 가져오기 위해 Foundation 프레임워크를 이용했습니다. main.swift 파일 상단에 import Foundation을 통해 Foundation 프레임워크를 불러와주세요.


그리고 아래 코드를  server.addRoutes(routes) 라인 아래에 작성해주세요.

if let homeURL = URL(string: NSHomeDirectory()) {
    var rootPath = homeURL.appendingPathComponent("WebDocuments", isDirectory: true).absoluteString
    
    try Dir(rootPath).create()
    
    server.documentRoot = rootPath
}

이렇게 설정하고 하위 경로 없이 접속하면 WebDocuments 폴더의 index.html 파일을 자동으로 메인 페이지로 볼 수 있습니다.




JSON 응답

이번에는 단순히 HTML 웹페이지가 아닌 JSON 응답을 줘보려고 합니다. 먼저 응답을 제어하기 위한 handler 클로저를 따로 함수로 구현하려 합니다. 가독성 면에서도 그게 좋을 것 같아요.


서버 인스턴스 생성코드 let server = HTTPServer() 전에 handler 함수를 구현해봅니다. 

func jsonHandler(request: HTTPRequest, response: HTTPResponse) {
    
    var jsonDictionary: [String: Any] = [:]
    jsonDictionary["name"] = "yagom"
    jsonDictionary["languages"] = ["Swift", "Objective-C"]
    jsonDictionary["age"] = 10
    jsonDictionary["alive"] = true
    
    do {
        response.setHeader(.contentType, value: "application/json; charset=utf-8")
        try response.setBody(json: jsonDictionary)
        response.completed()
    } catch {
        response.completed(status: .internalServerError)
    }
}


그리고 경로를 지정해주기 위해서 server.addRoutes(routes) 코드 위에 아래 코드를 작성합니다.

routes.add(method: .get, uri: "/json", handler: jsonHandler(request:response:))



다시 실행해서 /json 경로로 GET 요청을 하면 아래와같이 JSON 문자열을 응답한 것을 확인할 수 있습니다.




정리

지금까지 작성한 main.swift 파일 코드

import PerfectLib
import PerfectHTTP
import PerfectHTTPServer
import Foundation

func jsonHandler(request: HTTPRequest, response: HTTPResponse) {
    
    var jsonDictionary: [String: Any] = [:]
    jsonDictionary["name"] = "yagom"
    jsonDictionary["languages"] = ["Swift", "Objective-C"]
    jsonDictionary["age"] = 10
    jsonDictionary["alive"] = true
    
    do {
        response.setHeader(.contentType, value: "application/json; charset=utf-8")
        try response.setBody(json: jsonDictionary)
        response.completed()
    } catch {
        response.completed(status: .internalServerError)
    }
}

let server = HTTPServer()

server.serverPort = 8080
var routes = Routes()
routes.add(method: .get, uri: "/blog", handler: { request, response in
    
    let pageToResponse: Int
    
    if let page = request.param(name: "page"), let pageNumber = Int(page) {
        pageToResponse = pageNumber
    } else {
        pageToResponse = 0
    }
    
    response.setBody(string: "Handler was called page number:  \(pageToResponse)")
    response.completed()
})

routes.add(method: .get, uri: "/json", handler: jsonHandler(request:response:))

server.addRoutes(routes)


if let homeURL = URL(string: NSHomeDirectory()) {
    var rootPath = homeURL.appendingPathComponent("WebDocuments", isDirectory: true).absoluteString
    
    try Dir(rootPath).create()
    
    server.documentRoot = rootPath
}

do {
    try server.start()
} catch PerfectError.networkError(let error, let message) {
    Log.error(message: "Error: \(error), \(message)")
}


---------------------------------

물론 이 외에도 정말 많은 응용 방법과 라우트 하는 방법, 더 다양한 기능들이 있지만 모두 설명할 수 없으므로 정말 간단하게 감을 잡을 수 있는 정도만 해봤습니다. 차후에 간단한 프로젝트를 통해서 필요한 부분은 조금씩 더 설명하려고 합니다.


이정도 만들어 봤으면 대강 핑퐁은 해봤으니, 작은 미니 프로젝트 한 번 시작해 봐도 되지 않을까요?

다음 번에는 미니 프로젝트를 시작해볼 예정입니다~


다음에 또 만나요! :D


참고문서

* PerfectDocs - Routing

* PerfectDocs - HTTPResponse

* PerfectDocs - JSON Converter



by yagom

facebook : http://www.facebook.com/yagomSoft

facebook group : https://www.facebook.com/groups/yagom

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓ 블로거에게 공감은 큰 힘이 됩니다 ↓↓↓ 




저작자 표시 비영리 변경 금지
신고

'Swift > Perfect' 카테고리의 다른 글

사진 게시판 API 만들기 [3]  (0) 2017.08.09
사진 게시판 API 만들기 [2]  (0) 2017.07.11
사진 게시판 API 만들기 [1]  (6) 2017.06.27
Perfect 라우팅  (0) 2017.05.24
Perfect 시작하기  (0) 2017.05.17
우분투(Ubuntu)에 스위프트 설치하기  (0) 2017.04.03
Posted by yagom

컬렉션 타입

  • Array - 순서가 있는 리스트 컬렉션 
  • Dictionary - `키`와 `값`의 쌍으로 이루어진 컬렉션 
  • Set - 순서가 없고, 멤버가 유일한 컬렉션 

소스코드



Array

Array는 멤버가 순서(인덱스)를 가진 리스트 형태의 컬렉션 타입입니다.


Array 선언 및 생성

Array는 여러 리터럴 문법을 활용할 수 있어서 표현 방법이 다양합니다

// 빈 Int Array 생성
var integers: Array = Array()

// 같은 표현
// var integers: Array = [Int]()
// var integers: Array = []
// var integers: [Int] = Array()
// var integers: [Int] = [Int]()
// var integers: [Int] = []
// var integers = [Int]()


Array 활용

integers.append(1)
integers.append(100)

// Int 타입이 아니므로 Array에 추가할 수 없습니다
//integers.append(101.1)

print(integers)	// [1, 100]

// 멤버 포함 여부 확인
print(integers.contains(100)) // true
print(integers.contains(99)) // false

// 멤버 교체
integers[0] = 99

// 멤버 삭제
integers.remove(at: 0)
integers.removeLast()
integers.removeAll()

// 멤버 수 확인
print(integers.count)

// 인덱스를 벗어나 접근하려면 익셉션 런타임 오류발생
//integers[0]


let을 사용하여 Array를 선언하면 불변 Array가 됩니다

let immutableArray = [1, 2, 3]

// 수정이 불가능한 Array이므로 멤버를 추가하거나 삭제할 수 없습니다
//immutableArray.append(4)
//immutableArray.removeAll()


Dictionary

Dictionary는 의 쌍으로 이루어진 컬렉션 타입입니다.


Dictionary의 선언과 생성

Dictionary는 여러 리터럴 문법을 활용할 수 있어서 표현 방법이 다양합니다

// Key가 String 타입이고 Value가 Any인 빈 Dictionary 생성
var anyDictionary: Dictionary = [String: Any]()

// 같은 표현
// var anyDictionary: Dictionary  = Dictionary()
// var anyDictionary: Dictionary  = [:]
// var anyDictionary: [String: Any] = Dictionary()
// var anyDictionary: [String: Any] = [String: Any]()
// var anyDictionary: [String: Any] = [:]
// var anyDictionary = [String: Any]()


Dictionary 활용

// 키에 해당하는 값 할당
anyDictionary["someKey"] = "value"
anyDictionary["anotherKey"] = 100

print(anyDictionary) // ["someKey": "value", "anotherKey": 100]

// 키에 해당하는 값 변경
anyDictionary["someKey"] = "dictionary"
print(anyDictionary) ["someKey": "dictionary", "anotherKey": 100]

// 키에 해당하는 값 제거
anyDictionary.removeValue(forKey: "anotherKey")
anyDictionary["someKey"] = nil
print(anyDictionary)

let을 사용하여 Dictionary를 선언하면 불변 Dictionary가 됩니다


let emptyDictionary: [String: String] = [:]
let initalizedDictionary: [String: String] = ["name": "yagom", "gender": "male"]

// 불변 Dictionary이므로 값 변경 불가
//emptyDictionary["key"] = "value"

키에 해당하는 값을 다른 변수나 상수에 할당하고자 할 때는 옵셔널과 타입 캐스팅 파트에서 다룹니다

// "name"이라는 키에 해당하는 값이 없을 수 있으므로 
// String 타입의 값이 나올 것이라는 보장이 없습니다.
// 컴파일 오류가 발생합니다
let someValue: String = initalizedDictionary["name"]


Set

Set는 순서가 없고, 멤버가 유일한 것을 보장하는 컬렉션 타입입니다.

Set의 선언과 생성

// 빈 Int Set 생성
var integerSet: Set = Set()
integerSet.insert(1)
integerSet.insert(100)
integerSet.insert(99)
integerSet.insert(99)
integerSet.insert(99)

print(integerSet) // [100, 99, 1]
print(integerSet.contains(1)) // true
print(integerSet.contains(2)) // false

integerSet.remove(100)
integerSet.removeFirst()

print(integerSet.count) // 1


Set는 집합연산에 많이 활용됩니다

// Set는 집합 연산에 꽤 유용합니다
let setA: Set = [1, 2, 3, 4, 5]
let setB: Set = [3, 4, 5, 6, 7]

// 합집합
let union: Set = setA.union(setB)
print(union) // [2, 4, 5, 6, 7, 3, 1]

// 합집합 오름차순 정렬
let sortedUnion: [Int] = union.sorted()
print(sortedUnion) // [1, 2, 3, 4, 5, 6, 7]

// 교집합
let intersection: Set = setA.intersection(setB)
print(intersection) // [5, 3, 4]

// 차집합
let subtracting: Set = setA.subtracting(setB)
print(subtracting) // [2, 1]


생각해보기

다음과 같은 경우에는 각각 어떤 컬렉션 타입을, 상수/변수 선언 중 어떤 것을 사용하면 유용할지 생각해 봅시다. 

  • 영어 알파벳 소문자를 모아두는 컬렉션
  • 책의 제목과 저자 정리를 위한 컬렉션
  • 우리반 학생 명부 작성을 위한 컬렉션








by yagom

facebook : http://www.facebook.com/yagomSoft

facebook group : https://www.facebook.com/groups/yagom/


p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓ 블로거에게 공감은 큰 힘이 됩니다 ↓↓↓ 

저작자 표시 비영리 변경 금지
신고

'Swift > 기본문법' 카테고리의 다른 글

조건문  (0) 2017.05.29
함수  (2) 2017.05.25
컬렉션 타입  (0) 2017.05.22
데이터 타입  (0) 2017.05.18
상수와 변수  (0) 2017.05.15
이름짓기, 콘솔로그, 문자열 보간법  (0) 2017.05.11
Posted by yagom

Swift의 기본 데이터 타입


  • Bool
  • Int, UInt
  • Float, Double
  • Character, String


소스코드


Bool

truefalse만을 값으로 가지는 타입

var someBool: Bool = true
someBool = false
// someBool = 0 // 컴파일 오류발생
// someBool = 1 // 컴파일 오류발생



Int, UInt


Int


정수 타입. 현재는 기본적으로 64비트 정수형.

var someInt: Int = -100
// someInt = 100.1 // 컴파일 오류발생


UInt


양의 정수 타입. 현재는 기본적으로 64비트 양의 정수형.

var someUInt: UInt = 100
// someUInt = -100 // 컴파일 오류발생
// someUInt = someInt // 컴파일 오류발생


Float, Double


Float


실수 타입. 32비트 부동소수형.

var someFloat: Float = 3.14
someFloat = 3


Double


실수타입. 64비트 부동소수형.

var someDouble: Double = 3.14
someDouble = 3
// someDouble = someFloat // 컴파일 오류발생


Character, String


Character


문자 타입. 유니코드 사용. 큰따옴표("") 사용.

var someCharacter: Character = ""
someCharacter = ""
someCharacter = "가"
someCharacter = "A"
// someCharacter = "하하하" // 컴파일 오류발생
print(someCharacter)


String


문자열 타입. 유니코드 사용. 큰따옴표("") 사용.

var someString: String = "하하하  "
someString = someString + "웃으면 복이와요"
print(someString)

// someString = someCharacter // 컴파일 오류발생


생각해보기


다음 코드에서 integer, floatingPoint, apple 상수는 각각 어떤 타입이 될까요? 상상해보고 확인해보세요~!

let integer = 100
let floatingPoint = 12.34
let apple = "A"

힌트 : type(of: )



Any, AnyObject, nil


  • Any
  • AnyObject
  • nil


소스코드


Any


Swift의 모든 타입을 지칭하는 키워드

var someAny: Any = 100
someAny = "어떤 타입도 수용 가능합니다"
someAny = 123.12


Any 타입에 Double 자료를 넣어두었더라도 Any는 Double 타입이 아니기 때문에 할당할 수 없습니다. 명시적으로 타입을 변환해 주어야 합니다. 타입 변환은 차후에 다룹니다


let someDouble: Double = someAny  // 컴파일 오류발생


AnyObject


모든 클래스 타입을 지칭하는 프로토콜

클래스와 프로토콜에 대한 설명은 차후에 합니다

class SomeClass {}

var someAnyObject: AnyObject = SomeClass()


AnyObject는 클래스의 인스턴스만 수용 가능하기 때문에 클래스의 인스턴스가 아니면 할당할 수 없습니다.

someAnyObject = 123.12    // 컴파일 오류발생


nil


없음을 의미하는 키워드

다른 언어의 NULL, Null, null 등과 유사한 표현입니다.


아래 코드에서 someAnyAny 타입이고, someAnyObjectAnyObject 타입이기 때문에 nil을 할당할 수 없습니다.
nil을 다루는 방법은 옵셔널 파트에서 다룹니다.

someAny = nil         // 컴파일 오류발생
someAnyObject = nil   // 컴파일 오류발생


관련문서






by yagom

facebook : http://www.facebook.com/yagomSoft

facebook group : https://www.facebook.com/groups/yagom/


p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   

저작자 표시 비영리 변경 금지
신고

'Swift > 기본문법' 카테고리의 다른 글

함수  (2) 2017.05.25
컬렉션 타입  (0) 2017.05.22
데이터 타입  (0) 2017.05.18
상수와 변수  (0) 2017.05.15
이름짓기, 콘솔로그, 문자열 보간법  (0) 2017.05.11
스위프트 시작하기  (0) 2017.05.08
Posted by yagom


Perfect 시작하기

1. Perfect 패키지 설치
2. 서버 실행해보기



지난 번에 우분투에 스위프트를 설치해보았는데요, 

2017/04/03 - [Swift/Perfect] - 우분투(Ubuntu)에 스위프트 설치하기

이번엔 우분투에 퍼펙트를 설치 해볼 요량입니다. 

맥의 터미널에서도 동일(하거나 유사)한 명령어로 진행이 가능하니 맥에서 진행하셔도 무방합니다 :)


* 참고 *

2017년 5월 현재 Swift 3 / Perfect 최신버전 2.0.x 환경에서 진행함을 알려드립니다.

Swift 최신 버전 확인

Perfect 최신 버전 확인


리눅스 패키지 설치

우분투에서 Perfect를 사용하려면 OpenSSL, libssl-dev, uuid-dev가 필요합니다.
설치해줍니다. (맥에서는 설치할 필요가 없습니다.)

> sudo apt-get install openssl libssl-dev uuid-dev


프로젝트 폴더 생성

리눅스 패키지 설치를 완료하면 Perfect 프로젝트를 시작하고 싶은 위치에 프로젝트 폴더를 생성합니다.
> mkdir FirstPerfect

그리고 그 폴더 안으로 이동해주세요.
> cd FirstPerfect


Perfect 패키지 설치

Swift 3.0 이상부터는 Swift Package Manager를 통해 여러 패키지(라이브러리라고 생각하시면 편할 듯 합니다)의 의존성관리를 할 수 있습니다. 

스위프트 패키지 매니저를 사용하기 위해 초기화 해줍니다. --type excutable 옵션은 빌드 후 실행가능한 실행파일을 생성해달라는 옵션입니다.
> swift package init --type executable

swift package init 명령어를 실행하면 폴더에 Package.swift 파일도 함께 생성이 되었을텐데요, Package.swift 파일을 열어서 Perfect 패키지 의존성을 추가합니다.

> vi Package.swift


Package.swift 파일에 아래 코드를 작성합니다.

import PackageDescription

let package = Package(
    name: "FirstPerfect",
    dependencies: [
        .Package(url: "https://github.com/PerfectlySoft/Perfect-HTTPServer.git", majorVersion: 2)
	]
)


저장하고 나와서 패키지를 설치합니다.
> swift package update

만약에 맥에서 Xcode 프로젝트를 생성해주고 싶다면
> swift package generate-xcodeproj
해주시면 해당 폴더에 Xcode 프로젝트가 생성됩니다. 그러면 이후 코딩을 Xcode 프로젝트로 진행할 수 있습니다.


Perfect 프로젝트 실행

프로젝트 폴더의 Source/main.swift 파일을 열어봅니다.
> vi Source/main.swift

코드를 입력해봅니다.

import PerfectLib import PerfectHTTP import PerfectHTTPServer let server = HTTPServer() server.serverPort = 8080 do { try server.start() } catch PerfectError.networkError(let error, let message) { Log.error(message: "Error: \(error), \(message)") }


저장을 하시구요, 이제 빌드를 하고 실행을 해볼 차례입니다.
> swift build 
> ./.build/debug/FirstPerfect

만약 Xcode를 사용하고 있다면 타겟을 아래와 같이 변경 후 실행해 보세요.

실행하면 아래와 같은 정보가 출력됩니다.

[INFO] Starting HTTP server  on 0.0.0.0:8080

웹 브라우저에서 8080 포트로 접속해보시면 아래와 같은 메세지를 볼 수 있습니다.


서버 애플리케이션이 정상적으로 동작하고 있는 것입니다!


이제 처음으로 실행해 보았으니 이것저것 한 번 해봐야겠지요? 
다음 번에는 간단한 라우팅을 해볼게요~ 다음에 또 만나요! :D


참고문서



by yagom

facebook : http://www.facebook.com/yagomSoft

facebook group : https://www.facebook.com/groups/yagom

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓ 블로거에게 공감은 큰 힘이 됩니다 ↓↓↓ 





저작자 표시 비영리 변경 금지
신고

'Swift > Perfect' 카테고리의 다른 글

사진 게시판 API 만들기 [3]  (0) 2017.08.09
사진 게시판 API 만들기 [2]  (0) 2017.07.11
사진 게시판 API 만들기 [1]  (6) 2017.06.27
Perfect 라우팅  (0) 2017.05.24
Perfect 시작하기  (0) 2017.05.17
우분투(Ubuntu)에 스위프트 설치하기  (0) 2017.04.03
Posted by yagom

상수, 변수의 선언




소스코드


  • 상수 선언 키워드 let
  • 변수 선언 키워드 var


let 이름: 타입 =
var 이름: 타입 =


값의 타입이 명확하다면 타입은 생략 가능

let 이름 = 값  
var 이름 = 값
let constant: String = "차후에 변경이 불가능한 상수 let"
var variable: String = "차후에 변경이 가능한 변수 var"

variable = "변수는 이렇게 차후에 다른 값을 할당할 수 있지만"
// constant = "상수는 차후에 값을 변경할 수 없습니다" // 오류발생


상수 선언 후에 나중에 값 할당하기


나중에 할당하려고 하는 상수나 변수는 타입을 명시해주어야 합니다

let sum: Int
let inputA: Int = 100
let inputB: Int = 200

// 선언 후 첫 할당
sum = inputA + inputB

// sum = 1 // 그 이후에는 다시 값을 바꿀 수 없습니다, 오류발생

// 변수도 물론 차후에 할당하는 것이 가능합니다
var nickName: String

nickName = "yagom"

// 변수는 차후에 다시 다른 값을 할당해도 문제가 없지요
nickName = "야곰"


생각해보기


다음과 같은 경우에 각 값은 상수와 변수 중 어느 것으로 선언하는 것이 더 좋을지 생각해 봅시다.

OOO name = "yagom"
OOO numberToAdd = 5
OOO pi = 3.14195
OOO maxItemCount = 1000


관련문서





by yagom

facebook : http://www.facebook.com/yagomSoft

facebook group : https://www.facebook.com/groups/yagom/


p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   




저작자 표시 비영리 변경 금지
신고

'Swift > 기본문법' 카테고리의 다른 글

컬렉션 타입  (0) 2017.05.22
데이터 타입  (0) 2017.05.18
상수와 변수  (0) 2017.05.15
이름짓기, 콘솔로그, 문자열 보간법  (0) 2017.05.11
스위프트 시작하기  (0) 2017.05.08
Swift - 프로토콜, 익스텐션  (0) 2017.03.07
Posted by yagom

Swift 기초


소스코드


이름짓기 규칙


Lower Camel Case

fuction, method, variable, constant

someVariableName


Upper Camel Case

type(class, struct, enum, extension…)

Person, Point, Week

Swift는 모든 대소문자를 구분합니다.



콘솔로그 남기기

print 함수

단순 문자열 출력

dump 함수

인스턴스의 자세한 설명(description 프로퍼티)까지 출력


문자열 보간법

String Interpolation

프로그램 실행 중 문자열 내에 변수 또는 상수의 실질적인 값을 표현하기 위해 사용합니다.

\()


관련 문서





by yagom

facebook : http://www.facebook.com/yagomSoft

facebook group : https://www.facebook.com/groups/yagom/


p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   

저작자 표시 비영리 변경 금지
신고

'Swift > 기본문법' 카테고리의 다른 글

데이터 타입  (0) 2017.05.18
상수와 변수  (0) 2017.05.15
이름짓기, 콘솔로그, 문자열 보간법  (0) 2017.05.11
스위프트 시작하기  (0) 2017.05.08
Swift - 프로토콜, 익스텐션  (0) 2017.03.07
Swift - 구조체 클래스  (0) 2017.02.28
Posted by yagom

강좌소개




[PDF 자료]


 

시작합니다





by yagom

facebook : http://www.facebook.com/yagomSoft

facebook group : https://www.facebook.com/groups/yagom/


p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   

저작자 표시 비영리 변경 금지
신고

'Swift > 기본문법' 카테고리의 다른 글

상수와 변수  (0) 2017.05.15
이름짓기, 콘솔로그, 문자열 보간법  (0) 2017.05.11
스위프트 시작하기  (0) 2017.05.08
Swift - 프로토콜, 익스텐션  (0) 2017.03.07
Swift - 구조체 클래스  (0) 2017.02.28
Swift - 함수, 콜렉션 타입  (0) 2017.02.06
Posted by yagom


티스토리 툴바