콘텐츠로 건너뛰기
Home » swift » Page 13

swift

Swift에서 SQLite3 사용하기

SQLite3는 C/C++API를 제공하고 있으며, 사용하기도 그리 어렵지 않다. Swift에서 SQLite3를 사용하기 위한 가장 간단한 방법은 Obejctive-C로 DB를 액세스하는 함수나 클래스를 작성하고, Xcode 프로젝트에서 이 클래스를 추가해 Swift에서 사용하는 방법이다. 특히 코코아 클래스들과 Swift 타입들 간에는 바로 브릿징되면서 자동으로 변환되는 것들이 있기 때문에 사용하기에 편리한 점은 있지만, Objective-C에 익숙하지 않거나, 혹은 그냥 아무 이유없이 C API와의 연동을 해보고 싶은 경우가 있을 수 있기에 방법을 소개한다. SQLite3의 C API와 연동하는 방법에 대해서는 별도의 포스팅으로 내용을 분리하였다. 이 글에서는 C API를 직접 사용하면서… 더 보기 »Swift에서 SQLite3 사용하기

Swift에서 포인터를 함수에 전달하는 법

기본적으로 Swift는 C(그리고 Objective-C)와 호환이 가능하다. 이를 위해 C의 각 데이터 타입에 대응할 수 있는 Swift 타입들을 정의해 두고 있다. 따라서 C로 작성된 라이브러리를 사용할 수 있고, 이 때 해당 라이브러리의 함수들은 적절하게 Swift 버전에 맞는 시그니처로 변환된다. 예를 들어 문자열의 길이를 구하는 C함수인 strlen 함수를 Swift에서 호출하고 싶은 상황을 가정해보자. strlen 함수의 원형과 반입된 버전의 함수는 각각 아래와 같은 형태로 만들어질 것이다. 자 그러면 Swift 문자열의 길이를 저 함수를 사용해서 구하고 싶은 상황이라고 하자. 문자열을 어떻게 UnsafePointer<UInt> 로 변환할… 더 보기 »Swift에서 포인터를 함수에 전달하는 법

오일러 프로젝트 16

215 = 32768 의 각 자리수를 더하면 3 + 2 + 7 + 6 + 8 = 26 입니다. 21000의 각 자리수를 모두 더하면 얼마입니까? http://euler.synap.co.kr/prob_detail.php?id=16 접근 이 문제는 13번처럼 큰 정수를 다룰 수 있는지를 확인하는 문제이다. 사실 같은 수끼리 더하면 두 배가 되므로, “1” 부터 시작해서 s_add() 함수에 같은 값을 두 번 넣어서 두 배하는 동작을 1,000번 하면 간단히 해결된다. 파이썬은 큰 정수를 지원하므로 2의 1000 제곱을 계산해서 문자열로 바꾼 후, 다시 각 숫자를 정수로 바꿔서 합산한다. 어떤 수를… 더 보기 »오일러 프로젝트 16

Form submit via POST on Swift (NSURLSession)

POST 폼전송
NSURLSession을 통해서 POST로 폼 내용을 전송하는 예제를 작성해보겠다. 사실 이 예제는 꽤 예전에 Objective-C를 이용해서 작성해 본 바 있는 내용이다.
먼저 POST 폼 전송에 대해서 잠깐 살펴보면, 폼의 각 필드명과 필드값이 GET 방식과 비슷한 형태로 연결되고 URL인코딩을 거쳐 바이너리스트림 데이터로 생성된다. 이걸 submit 하게 되면 브라우저는 웹서버의 해당 주소에 HTTP 요청을 보내게 되는데,더 보기 »Form submit via POST on Swift (NSURLSession)

Swift의 조건절 패턴 매칭 총정리

C 언어의 if 문은 조건이 되는 표현식을 평가하여 0이면 거짓, 0이 아니면 참으로 판단한다. 많은 언어들이 C언어와 같은 방식으로 작동하는 분기문을 지원하고, 따라서 많은 프로그래머들이 여기에 익숙하기 때문에, Swift의 복잡한(?) if 문법이 당혹스러울 수 있다. 이번 글에서는 Swift의 복잡한 조건절을 어떻게 사용하는지 살펴보도록 하겠다. Swift는 조건값이 아닌 조건에 대한 패턴매칭을 기반으로 작동한다. 즉 if 다음에는 “조건 리스트”가 오게 된다. 그리고 이 조건 리스트는 다음 중 하나의 패턴이 된다. 옵셔널 바인딩 우선 가장 많이 등장하는 패턴 중 하나인 옵셔널 바인딩 먼저… 더 보기 »Swift의 조건절 패턴 매칭 총정리

defer 문 이해하기

Defer in Swift 2.0

Swift 2.0 에서 새롭게 등장한 defer 구문을 살펴보자. defer문은 다음 코드를 현재 스코프를 벗어날 때 실행한다는 예약이다. 무슨 말인고 하니,

<br />func doit() {
    defer{ print("4")}
    print("2")
    print("3")
}
print("1")
doit()
print("5")

위 코드의 실행 결과는 순서대로 1 -> 2 -> 3 -> 4 -> 5이다. defer는 이후에 받는 블럭을 당장 실행하지 않고 현재 블럭 범위가 종료될 때 실행한다. 이는 단순히 실행의 우선순위를 변경하는 것외에 매우 요긴하게 쓰일 수 있다. 더 보기 »defer 문 이해하기

Contacts 프레임워크

Contacts 프레임워크를 이용한 주소록 액세스

iOS8 까지는 AddressBook 프레임워크를 이용해서 시스템의 주소록 데이터베이스에 액세스할 수 있었는데, iOS9에서는 이 프레임워크 자체가 deprecated 되었다. (헐…) 대신에 연락처를 액세스하는 별도의 프레임워크인 Contacts가 신설되었다. 더 보기 »Contacts 프레임워크

Swift :: NSScanner 사용예제

NSScanner로 문자열로부터 특정한 값 뽑아내기

이 문서는 Swift 4.2를 기준으로 수정되었습니다. NSScanner에 대한 Swift Foundation 대응 클래스인 Scanner 클래스가 새로 정의되었으며, CharacterSet에 대한 몇 가지 사용 방법이 변경되었습니다

  1. 스캔할 문자열을 넘겨서 Scanner 객체를 생성한다.
  2. 스캐너가 무시하고 지나가야 할 문자들이 있으면 CharacterSet 타입의 값으로 만들어서 charactersToBeSkipped 속성으로 지정한다.
  3. 자, 이제 스캔을 시작하지.

이때, 스캐너의 API는 예전 Objective-C API에서 크게 바뀌지 않은 관계로 포인터를 인자로 받고, 넘겨 받은 포인터가 가리키는 객체에 스캔한 값을 쓰게 된다.

더 보기 »Swift :: NSScanner 사용예제

Swift :: @noescape explained

#@noescape @noescape는 함수 파라미터로 클로져를 선언할 때 해당 클로저내의 모든 정보가 외부로 나갈 수 없음을 명시한다. 표현이 좀 애매한데, @noescape로 선언된 클로져는 다음의 동작만이 가능하다. 클로저가 인자로 전달된 함수 내에서 호출 가능 함수 내에서 다른 함수(이 때 이 다른 함수도 클로져를 @noescape로 선언한 경우에만)로 전달하여 호출할 수 있다. 다른 함수나 클로저에서 역시 @noescape로 선언된 경우에 캡쳐 다음의 경우에는 쓸 수 없게 된다. 다른 지역변수에 대입이 불가하다. 이는 클로져 내의 캡쳐된 모든 변수에 대해서 추가적인 강한 참조를 더할 수 없다는 뜻이다.… 더 보기 »Swift :: @noescape explained