콘텐츠로 건너뛰기
Home » 스터디 » 페이지 12

스터디

복사-붙여넣기가 지원되는 클래스 작성하기 – Cocoa, Swift

복습

이전 시간에 macOS에서 클립보드를 통해서 복사와 붙여넣기를 통해서 뷰 혹은 앱간의 데이터를 교환하는 과정에 대해서 살짝 살펴보았다. 어떤 클래스의 객체가 클립보드로 복사되려면, 해당 클래스는 클립보드에게 어떤 타입의 데이터들을 넣어줄 수 있음을 알리고, 각 타입에 대한 데이터를 생성하여 클립보드에게 전달해주는 동작을 수행해야 하며, 이 동작은 NSPasteboardWriting에 정의되어 있다. 그리고 붙여넣는 시점에 특정한 클래스의 객체를 클립보드에 요청하면, 클립보드는 해당 클래스의 객체를 생성할 수 있는 타입들을 조사한 후, 조달 가능한 타입에 대응하는 데이터를 이용해서 해당 클래스 객체를 생성해 붙여넣는 쪽으로 전달해주게 된다. 즉 클립보드로부터 생성할 수 있는 클래스는, 객체를 생성할 수 있는 데이터의 타입과, 타입별 데이터를 전달받아 인스턴스를 만드는 방법을 알고 있어야 한다. 이 내용은 NSPasteboardReading에 정의된다.

복사/붙여넣기의 동작은 어떤 클래스로부터 이진데이터를 만들어서 클립보드에 올려놓고, 또 클립보드 데이터로부터 어떤 클래스를 만드는 일과 관련된다. 하지만 이것은 직렬화/역직렬화와는 다르다. 왜냐하면 복사/붙여넣기 동작은 앱과 앱 사이에서도 발생할 수 있는 일이기 때문이다. 따라서 데이터 공급과 소비의 관점에서 이해해야 하며, 이 때 오가는 데이터는 1가지 이상의 타입일 수 있다.

보통의 복사/붙여넣기 동작과 관련해서는 특수한 타입의 데이터보다는 일반적인 표준 클래스의 데이터를 더 많이 쓰게되므로 실질적으로 커스텀 클래스를 클립보드에 복사해넣는 일은 그리 많지 않다. 하지만 궁금해하지 말라는 법은 없으니, 복사/붙여넣기를 지원하는 커스텀 클래스를 어떻게 작성할 수 있는지에 대해서 알아보도록 하자. 

더 보기 »복사-붙여넣기가 지원되는 클래스 작성하기 – Cocoa, Swift

배열리터럴로 만들 수 있는 클래스 정의하기

ExpressibleByArrayLiteral Set 인스턴스를 만들 때, Array와 같이 [1, 2, 3] 와 같은 식으로 배열 리터럴을 이용해서 초기화하는 것이 가능하다. 이렇게 배열 리터럴을 이용해서 초기화할 수 있는 것은 ExpressibleByArrayLiteral이라는 프로토콜을 따를 때 가능해지는 것으로, 커스텀 집합 혹은 컨테이너 타입을 만들 때, 이 프로토콜을 준수하면 배열리터럴로 해당 타입을 생성하는 것이 가능해진다. 이 프로토콜은 init(arrayLiteral:) 구현해주면 된다. 일전에 예제로 만들어 본 바 있는 Stack의 경우에도 이를 적용할 수 있다. 이 이니셜라이저는 실제로 [T] 타입의 배열로 된 인자를 받아서 각 원소들을 사용해서 스스로를 구성하게 되면… 더 보기 »배열리터럴로 만들 수 있는 클래스 정의하기

(Swift) Objctive-C와 Swift 타입의 브릿징

브릿징

Swift의 많은 기본 타입들은 Objective-C의 파운데이션 타입에 대응되는 것들이 있고 (e.g. String <-> NSString) 이렇게 카운터파트가 존재하는 타입들은 파운데이션타입으로 브릿징된다. 브릿징은 Objective-C 타입이 Swift 타입으로 행동하거나 혹은 반대로 Swift 타입이 Objective-C 타입처럼 행동하여 이 둘을 상호간에 바꿔쓸 수 있음을 말한다. 다시 말해 파운데이션 API를 사용하면서 NSString 을 사용해야 할 때 String을 쓰거나 반대로 Swift 함수/메소드 호출 시 String 을 써야 할 때 NSString을 쓰는 것이 허용된다는 말이다. 1

 Swift는 어떤 Objective-C 타입들을 자동으로 Swift 타입으로 변환하며, 그 반대의 동작도 자동으로 수행합니다. 이렇게 Objective-C와 Swift 사이에서 전환되는 타입들을 “bridged types”라 부릅니다. 예를 들어, Swift 코드에서 NSString 파라미터를 요구하는 Objective-C API에 String 타입의 값을 넘겨줄 수 있습니다. 또한 많은 코코아 프레임워크들은 API를 좀 더 Swift 스럽게 새로 정의했습니다. 예를 들어 NSCoderdecodeObjectOfClass(_:forKey:)는 Swift의 제네릭 타입을 통해 보다 강한 타입시그니처를 갖게 됐습니다.2

사실 이 브릿징은 Objective-C에 익숙하다면 낯선 개념은 아니다. 코코아에는 Objective-C가 아닌 C로 제작된 코어 파운데이션 프레임워크가 있고, 이미 NS* 클래스들은 CF* 타입들과 브릿징되고 있다. 더 보기 »(Swift) Objctive-C와 Swift 타입의 브릿징

(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 프로토콜

Cafe24에서 Python CGI 돌리기

Cafe24에서 Python CGI 돌리기

Cafe24에서 가상리눅스 호스팅 같은 걸 받으면 파이썬3도 설치할 수 있고 그렇다만, 여기서는 기본 호스팅에서 파이썬 CGI를 실행하는 방법을 살펴보도록 하자. (일단 파이썬 버전이 2.4이고 커스텀 모듈을 설치할 수도 없기 때문에 여러모로 좌절스럽긴 하다)

  1. CGI 파일의 위치는 특정한 위치에 들어갈 필요는 없다.
  2. 파일의 확장자는 반드시 .cgi 여야 한다. .py인 경우 일반 텍스트 파일처럼 처리된다.
  3. 첫행은 반드시 #!/home/bin/python 이어야 한다. cafe24 매뉴얼에서 #!/home/bin/python2라고 무려 잘못된 내용을 안내해주고 있다.
  4. 실행 권한은 상관없는 것 같기도 하다.

더 보기 »Cafe24에서 Python CGI 돌리기

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