콘텐츠로 건너뛰기
Home » Swift » 페이지 10

Swift

Swift / Cocoa / Foundation / Programming Language / UIKit / AppKit / Swift Standard Library / Swift 문법과 기능 / 공부하면서 알게된 내용들을 정리 / 어느 프로그래밍 언어 덕후의 연습장

정수 배열의 최대 부분합 (연습문제)

배열의 연속된 부분집합의 최대합 정수 배열이 주어질 때 배열내의 연속된 원소를 더한 부분합의 최대값을 구하는 문제이다. 구간이 아닌 최대값 자체를 구하면 되는 문제이다. 간단히 생각하면 0부터 1, 2, 3 … n 까지의 합 중 최대인 값, 그 다음은 1부터 2, 3, 4 .. n 까지의 값 중 최대인값 이렇게 비교해나갈 수 있는데 그러면 반복계산이 너무 많다. 따라서 DP를 이용한다. 0번 인덱스까지의 최대합은 0번 값 그 자체이다. i번 인덱스까지의 최대 부분합은, (i-1) 번 까지의 최대 부분합과 i번 값의 합이다. 이 때… 더 보기 »정수 배열의 최대 부분합 (연습문제)

What Happened to NSMethodSignature?

NSInvocation에 대해 찾아보다가 Swift 공식 블로그에서 찾은 글을 간단히 번역해본다.

https://developer.apple.com/swift/blog/?id=19

What Happened to NSMethodSignature?

코코아 프레임워크를 Swift로 옮기는 것은 우리 스스로가 우리의 API를 새로운 관점에서 볼 수 있는 좋은 기회가 되었습니다. 우리는 Swift의 목표에 맞지 않는다고 생각되는 클래스들을 찾았고, 우리의 우선순위는 주로 안전성에 맞췄습니다. 예를 들어 동적인 메소드 호출(dynamic method invocateion)과 관련된 클래스들은 Swift에 반입되지 않습니다. 이러한 클래스에는 NSInvocationNSMethodSignature가 있지요.
우리는 최근에 이 클래스들이 빠져있음을 발견한 한 개발자로부터 버그 리포팅을 받았습니다. 이 개발자는 Objctive-C에서 메소드 인자들의 타입을 검사하는데 NSMethodSignature를 사용하고 있었고, Swift로 마이그레이션하는 과정에서 이 클래스를 사용할 수 없다는 것을 알았습니다. 실제 그 코드는 인자 타입이 정해지지 않은 HTTP 핸들러릘 받도록 되어 있었습니다. 예를 들면 이런 것들이죠.더 보기 »What Happened to NSMethodSignature?

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

UIDynamics 예제

예전에 관련된 내용을 작성한 적이 있는데, 여기서는 내용과 예제를 좀 더 보강한 버전이다. 또한 해당 예제들은 모두 Swift3 버전으로 작성되었다.

UIDynamicAnimator

다이내믹 애니메이터는 물리연산과 관련된 계산이나 애니메이션을 다이내믹 아이템에 적용하고, 그 결과로 계산된 애니메이션 컨텍스트를 제공한다.
더 보기 »UIDynamics 예제

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

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

추상클래스

추상클래스

추상클래스(abstract class)는 OOP 언어의 특징 중 하나로, 클래스가 무엇인가 하는 점과 그것이 어떻게 구현되는가 하는 지점의 경계에 있는 개념이다. 이 타입의 메소드는 실제 메소드 및 추상 메소드를 포함한다. 추상 클래스는 인스턴스화 될 수 없으며, 인스턴스를 만들고 싶다면 해당 클래스를 상속받는 서브 클래스를 만들어서 인스턴스화해야 한다.
더 보기 »추상클래스

꼬리재귀 최적화와 트램폴린

꼬리재귀 최적화

꼬리재귀는 재귀의 특별한 한 형태인데, 재귀호출로 받은 결과값을 추가로 계산하거나 처리하지 않고 그대로 리턴하는 형태를 말한다. 예를 들어 1부터 n 까지의 합을 구하는 함수를 재귀로 구현했다고 하면 일반적으로 다음과 같은 꼴을 생각할 수 있다.

<br />func sum1(n: Int) -> Int {
  if n < 1 { return 0 }
  return n + sum1(n - 1)
}

이를 꼬리 재귀로 만들면 다음과 같다.

func sum2(n: Int, acc: Int = 0) -> Int {
  if n < 1 { return acc }
  return sum2(n-1, acc: acc + n)
}

더 보기 »꼬리재귀 최적화와 트램폴린

protocol and operator

프로토콜과 연산자 Equatable과 같은 프로토콜은 메소드가 아닌 연산자에 의한 연산을 정의한다. 보통 프로토콜은 특정 타입이 구현해야 하는 메소드나 프로퍼티를 정의하는 것인데, 연산자에 의한 연산은 어떻게 정의할 수 있을까? 답 연산자는 특별한 종류의 함수이다. 연산자는 연산자의 이름이 될 수 있는 특별한 패턴이 있으므로 프로토콜 내에서 정의되었을 때 연산자로 인지하게 된다. 수정 (2016-10-04) : 프로토콜이 특정 연산자의 기능을 선언하거나 오버로드하는 경우, 이를 구현하는 타입의 정의 내에서 일반 메소드와 마찬가지로 연산자 오버로딩을 작성할 수 있다. infix operator ~~= { associativity left } protocol… 더 보기 »protocol and operator

TableView for OSX

OSX의 테이블뷰 사용법

iOS의 테이블과 달리, OSX의 테이블뷰는 행과 열이 모두 존재하는 애트리뷰트들을 가진 레코드들의 집합을 표시하는 테이블이다. 예를 들어 종업원들의 명부를 표시하는 테이블 뷰는 성, 이름, 지점명의 각각의 칼럼을 가진 테이블을 표시하게 된다.
테이블 뷰는 하나 혹은 그 이상의 칼럼을 가질 수 있으며 횡방향, 종방향으로 스크롤 되고, 선택 영역을 가질 수 있고, 칼럼의 드래깅을 지원한다. 각각의 행은 데이터 집합 내에서 대응하는 하나 이상의 셀을 포함한다.

이 문서에서 은 테이블 내 실제 칸 하나를 의미한다. 셀을 나타내는 NSCell 혹은 그 서브 클래스는 필요하면 클래스명으로 직접 언급한다.

더 보기 »TableView for OSX