콘텐츠로 건너뛰기
Home » swift3

swift3

(Swift) Array – 05. NSArray

목차

  1. Array – 생성과 조작
  2. Array – Sequence 프로토콜
  3. Array – Collection 프로토콜
  4. Array – ArraySlice
  5. Array – NSArray

브릿징 – NSArray

NSArray에서 제공하는 API를 사용하기 위해서는 Array 인스턴스를 as NSArray를 통해서 브릿징해야 한다. 브릿징이 가능한 경우는 배열 내 원소의 타입이 다음 중 한가지여야 한다.

  1. 클래스
  2. @objc 속성이 있거나 Objective-C로부터 들여온 프로토콜
  3. 애초에 Foundation 타입으로 브릿지 되는 타입

아래 예제는 Array 인스턴스를 NSArray 인스턴스로 브릿징하여 그 내용을 write(to:atomically:)로 저장하는 방법을 보여준다. [String] 타입은 NSArray<NSString>으로 브릿징이 가능하지만 [String?] 타입에 대해서는 불가능한데, String? 옵셔널 타입은 NSString으로 브릿징되지 않기 때문이다.더 보기 »(Swift) Array – 05. NSArray

(Swift) Array 완전 정복 – 04. ArraySlice

ArraySlice 와 Range

배열은 단일 인덱스를 통해 하나의 원소를 액세스하는 것 외에도 범위(Range<Index>)값을 통해 하나 이상의 원소로 이루어진 부분 배열을 액세스하는 것이 가능하다.

let a = Array<Int>(1...10)
let b = a[3..<6] // [4, 5, 6]

범위는 ... 연산자와 ..< 연산자를 통해서 만들 수 있는데, 전자는 닫힌 범위, 후자는 열린 범위이다. 열린 범위는 맨 끝 값을 포함하지 않는 범위이다. 즉, 1...10 ==> 1, 2, 3 .. 10 이고 1..<10 ==> 1, 2, 3, .. 9 이다.
범위에 대해서도 좀 더 살펴봐야하겠지만, 여기서는 이 부분열에 대해 생각해보자. 이제 배열에 대해 보다 깊숙히 들여다 볼 차례이다.더 보기 »(Swift) Array 완전 정복 – 04. ArraySlice

(Swift) Array 완전 정복 – 03. Collection 프로토콜

Collection

 
Collection은 일반적인 “집합 컨테이너”를 묘사하는 프로토콜인데, 실질적으로는 Sequence 프로토콜을 상속하면서 한 가지 개념(기능)을 추가한 것으로 이해할 수 있다. 그것은 임의의 인덱스를 통해서 개별 원소를 액세스할 수 있는 점이다. 따라서 Sequence와 달리 여러번이고 순회할 수 있고, 순회 시 내부 자료가 소모되지 않는다.더 보기 »(Swift) Array 완전 정복 – 03. Collection 프로토콜

(Swift) Array 완전정복 – 02. Sequence 프로토콜

Sequence

시퀀스(Sequence)는 직역하면 연속열이 될 수 있으며, 문자 그대로 개개의 원소들을 순서대로 하나씩 순회할 수 있는 타입을 의미한다. (Swift 기본 타입에 대해서는 사실상 모든 집합 타입이 이에 해당한다.) 시퀀스는 사실 Swift 문법과 밀접한 관련이 있는데, 바로 for - in 구문에 사용된다는 점이다.1더 보기 »(Swift) Array 완전정복 – 02. Sequence 프로토콜

NSRegularExpression : 정규식 사용하기 – Swift

Swift의 정규식

Swift는 언어 자체에서 정규식을 지원하지 않고 FoundationNSRegularExpression 클래스를 이용한다.

  1. NSRegulareExpressioninitthrows이기 때문에 try와 같이 사용되어야 한다.
  2. 매치 결과는 TextCheckingResult 클래스의 인스턴스를 얻게 된다. 이는 매치영역 및 영역 내 각 매치 그룹의 범위를 NSRange값으로 가지고 있다.
  3. 문제는 Swift 문자열의 부분문자열은 Index<String.Index>에 의해서 얻을 수 있지, NSRange를 이용할 수 없다. 따라서 이를 컨버팅하는 편의함수나 타입 확장을 이용해야 한다. (사실 이 부분은 Linux 버전의 Swift의 문제이다. Apple Swift에서는 Foundation/Cocoa를 임포트하게 되면  NSString의 API가 그대로 String으로도 노출되기 때문에 그대로 사용이 가능하다.)

더 보기 »NSRegularExpression : 정규식 사용하기 – Swift

SQLite3 C API를 Swift에서 사용하는 방법

Swift에서 SQLite3를 사용하는 방법은 크게 두 가지이다. 하나는 Objective-C에서 SQLite3를 액세스하는 래퍼 클래스를 작성하고, 이 것을 Swift 프로젝트에 포함시켜서 컴파일하는 것이다. Swift는 Objective-C와 자연스럽게 상호호환되기 때문에 Objective-C에 친숙하다면 이 방법도 나쁘지 않다.

관련글 : Objective-C 래퍼를 통해 Swift에서 SQLite3를 사용하는 법

다른 한가지 방법으로는 sqlite3.h 헤더를 Swift에서 반입하여 Swift에서 SQLite3 C API를 바로 사용하는 것이다. 결국 업어치나 메치나 똑같은 것이기는 한데, Swift에서 C API를 직접 사용하는 것은 Swift와 C의 연계 방식에 대한 이해가 필요하다. 이 글에서는 Swift에서 Sqlite3를 사용하기 위해 필요한 배경 지식들에 대해서 살펴볼 예정이다. SQLite3 API에 대한 자세한 설명이 필요할 수 있는데, 이 내용은 Objective-C에서 SQLite3를 사용하는 법을 다룬 위 링크에서 대략 소개하고 있으며, 이 글에서는 최소한 SQLite3 API에 대해 알고 있다고 전제하겠다.

SQLite3 C API를 사용하여 쿼리를 실행하는 결과에 대해서는 다음의 과정을 거친다.

  1. 데이터베이스 연결
  2. 쿼리 컴파일 및 쿼리 바인딩
  3. 쿼리 실행 및 각 Row의 데이터 획득
  4. 연결닫기
더 보기 »SQLite3 C API를 Swift에서 사용하는 방법

(Swift) – 힙(Heap) – 자료구조에 대해

heap은 일종의 바이너리 트리를 단일 배열을 이용해서 구현한 구조로,  부모 자식 간의 직접적인 참조를 갖지 않고 배열의 인덱스에 의해서 위치 관계를 파악한다. 특히 내부 배열의 상태는 부분적으로 정렬되는 것과 비슷한데, 항상 “맨 앞의 원소를 꺼내었을 때 그 값이 최대 혹은 최소가 된다”는 특성을 가진다. 힙은 흔히 최대힙과 최소힙으로 구분하는데 이는 동일한 것이며 단지 정렬 순서만 다르다. 주로 자료 구조에서는 최대/최소 힙, 바이너리 힙, 힙 큐 혹은 우선순위 큐와 같은 이름으로 불린다.

참고로 이 자료 구조의 파이썬 구현은 [우선순위 큐 혹은 최소/최대힙]에서 한 번 설명한 바 있다.

힙으로 할 수 있는 일은 다음과 같다.

  1. 우선순위 큐를 만든다.
  2. 힙 정렬 수행
  3. 변경가능한 집합의 최소값(혹은 최대값)을 빈번히 계산해야 할 때 유용하다. (특히 최단거리 탐색 시)

더 보기 »(Swift) – 힙(Heap) – 자료구조에 대해

gcd in swift3

GCD in Swift3 iOS/OSX에서 동시성을 처리하기 위해서는 NSThread로부터 NSOpaerationQueue에 이르는 방법이 있었고, 시스템 레벨에서 모든 걸 관리해주는 GCD가 나오기에 이르렀다. 하지만 GCD는 libdispatch의 API를 그대로 사용했기 때문에 Swift에서는 가장 번거로운 문법을 이용해야 했었으나, Swift3에서 API를 전면적으로 개선했다. dispatch_async 이전에는 동기/비동기 여부를 결정한 후 어떤 큐를 쓸 것인지를 결정하는 순서로 코드가 작성되었는데, 이제는 이 순서가 바뀌었다. 왜냐면 dispatch_async, dispatch_sync는 자유함수에서 큐의 메소드로 편입되었기 때문이다. DispatchQueue.global(attributes:[.qosDefault]).async { // 백그라운드 작업 DispatchQueue.main.async(execute: { /* … */ }) } 큐의 속성은 생성시점에 지정될 수… 더 보기 »gcd in swift3

날짜와 시간을 다루기 – Swift Date/Time

날짜와 관련된 계산은 사실 알고보면 굉장히 복잡하고 어려운 작업이다. 날짜와 시간의 상관관계에 대해서 몇 가지 규칙들을 나열해보면 우리가 일상적으로 사용하는 날짜나 시간에 관한 규칙이 사실은 엄청나게 복잡하다는 것을 알게 된다. 기본적으로 초(second)를 가장 기본적인 시간의 단위로 생각한다. (더 작은 단위로 밀리초나 나노초가 있지만, 이들은 10진법 기반이므로 따로 생각하지 않아도 된다.) 초와 분은 60도법으로 계산된다. 60초는 1분, 60분은 1시간이다. 하루는 24시간으로 이루어진다. (그리고 놀랍게도 시계가 표시하는 시간은 지구상에서의 위치에 따라 또 다르다.) 사실 여기까지 생각했을 때는 별로 어렵지 않다. 하지만 날짜가… 더 보기 »날짜와 시간을 다루기 – Swift Date/Time

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 사용하기