콘텐츠로 건너뛰기
Home » Development » Swift » Page 15

Swift

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

guard 문법(Swift 2.0)

guard

Swift 2.0에서 새로운 guard 문이 추가되었다. 이는 특정 조건을 만족하지 않을 때 지정한 블럭을 수행하는 것이며, 따라서 필연적으로 else 를 써야 한다. 기본적인 문법은 다음과 같다.

guard x > 0 else { return }

이 문법은 사실 본질적으로더 보기 »guard 문법(Swift 2.0)

문자열의 부분집합(Swift)

문자열의 부분집합 구하기 Swift3으로 업데이트 (2016-07-04) 인덱스타입(Index)은 특정한 집합 내에서의 위치를 가리키기 때문에 다음번 인덱스의 위치를 계산하기 위해서는 원래의 문자집합을 알고 있어야 한다. 따라서 advance() 메소드는 상당히 부담스러우므로, 성능 개선을 위해서 이는 문자열에서 특정 인덱스의 오프셋 이동을 하는 메소드를 사용하도록 바뀌었다. String.index(_:offset:) Range 타입의 양끝은 startIndex, endIndex가 아닌 lowerBound, upperBound가 되었다. 따라서 서브스크립션 확장은 다음과 같이 재작성 된다. extension String { subscript(r: Range<Int>) -> String { let a = self.index(startIndex, offsetBy: r.lowerBound) let b = self.index(startIndex, offsetBy: r.upperBound) return self[a..<b]… 더 보기 »문자열의 부분집합(Swift)

Selector in Swift

셀렉터(Swift) 셀렉터는 Objective-C 메소드의 이름을 가리키는 참조타입이다. @selector() 디렉티브를 써서 메소드 이름을 정수값으로 맵핑하여 표시한다. Swift에서는 이 셀렉터는 Selector라는 구조체로 표현되며 문자열 리터럴로 만들 수 있다. 만드는 방법은 Objective-C 스타일과 거의 유사하다. import UIKit class MyViewController: UIViewController { let myButton = UIButton(frame: CGRect(x:0, y:0, width:100, height:50)) init(nibName nibNameOrNil:String?, bundle nibBundleOrNil:NSBundle?) { super.init(nibName:nibNameOrNil, bundle: nibBundleOrNil) myButton.addTarget(self, action:"tappedButton:", forControlEvents:.TouchUpInside) } func tappedButton(sender:UIButton!) { println("tapped inside") } } NSObject의 performSelector:의 경우 안정성의 문제로 현재(2015. 01)까지는 Swift에서는 불가능하다. 만약 Swift 클래스가 Objective-C의 클래스를 상속받지… 더 보기 »Selector in Swift

unowned self

Swift의 클래스가 다른 인스턴스를 프로퍼티로 갖게 되는 경우, 만약 두 인스턴스가 서로를 프로퍼티로 참조하게 되면 상호간에 강한 참조 순환1이 발생하게 된다.
이를 해결하기 위해서는 변수 선언시에 weak이나 unowned를 명시하여 약한 참조가 발생하도록 한다. 더 보기 »unowned self

블럭의 변수 캡쳐링

블럭 내 변수 캡쳐링

C의 코드블럭은 사실상 여타 프로그래밍 언어의 클로저개념1과 거의 동일하다.
블럭 내부에서는 다음의 변수들을 사용할 수 있다.

  1. 전역변수와 정적변수는 블럭내에서 액세스 가능하다.
  2. 블럭 내로 전달된 파라미터는 블럭 내부로 복사되며 지역변수처럼 액세스한다.
  3. 블럭을 감싼 영역의 스택 변수는 블럭 내에서 액세스 가능하되 상수로 취급한다.
  4. 블럭을 감싼 영역에서 __block 변경자와 함께 선언된 변수는 참조로 전달되며, 블럭내에서 변경 가능하다.
  5. 블럭 내에서 선언된 지역 변수는 함수의 지역변수와 동일하게 동작한다. 액세스 가능하며, 블럭의 스코프가 끝날 때 파괴된다.

더 보기 »블럭의 변수 캡쳐링

Swift의 꼬리 재귀

Natasha ElementTypehe Robot에 꼬리와 꼬리재귀에 대한 글이 올라오고 Digg에서 많은 digg을 얻었는데, 좀 이상해서 내용을 정리해본다. 링크한 글의 저자는 꼬리재귀와, 함수형 언어의 자료 구조인 리스트의 head, tail을 혼동하고 있는 듯 하다. 우선 꼬리재귀에 대해서 먼저 이야기하겠다. 꼬리 재귀는 재귀의 특별한 한 형태이다. 꼬리 재귀를 설명하기 전에 먼저 재귀(recursion)에 대해 알아보자. 재귀는 어떤 함수의 내부에서 스스로를 다시 호출하는 것을 말한다. 예를 들어서 1에서 10 까지의 자연수의 합을 구하는 과정을 재귀적인 처리를 통해서 구한다고 생각해보자. 이렇게 풀어써서 복잡한데, 조금 더 이해하기 쉬운… 더 보기 »Swift의 꼬리 재귀

날짜와 시간을 다루기(Swift)

날짜와 시간 다루기 (Swift)

Swift에서 날짜와 시간을 다루는 방법은 Foundation 프레임워크의 NSDate, NSCalendar, NSDateFormatter, NSDateComponents 등을 사용하게 되므로 Objective-C의 그것과 약간의 문법 차이만 있을 뿐이다.

날짜 계산의 기본 개념

날짜 계산의 단위가 되는 객체는 NSDate이다. 이 클래스는 특정한 시점을 가리키는 정보를 담고 있다. 기본적으로는 기준일시로부터 몇초가 지났는지를 담아서 타임라인 상의 특정한 지점을 가리키게 된다.
Foundation에서 NSDate는 특정한 시점을 가리키는 포인터에 지나지 않는다. 다른 언어들의 date/datetime 객체와 달리 NSDate 클래스 자체로부터 이 날이 무슨 요일인지 등의 정보는 구할 수 없다. 그 이유는 Foundation은 특정 국가나 문화권에 종속되는 규격이 아니기 때문에 어떤 로케일을 적용하느냐에 따라서 한달의 길이라든가 그런 것들이 다를 수 있기 때문이다. 더 보기 »날짜와 시간을 다루기(Swift)

Tuple Unpacking in Swift

Swift에서도 튜플 언팩킹이 되기에, 이를 이용하면 유용하게 쓸 수 있는데…. 예를 들어 두 변수의 값을 바꾸려면 var a = 1 var b = 2 swap(&a, &b) println("now a is (a) and b is (b)") 라고 했던 것을 간단히 (a, b) = (b, a) 라 쓰기만 해도 된다. Xcode 6.1에서 잘 동작하나, 아직 swiftstub.com 쪽에는 반영이 안되는 듯.

Swift – Interacting with C Pointers

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

Objective-C 및 C의 API들은 종종 포인터를 사용한다. Swift의 데이터 타입들은 포인터 기반의 Cocoa API들과 자연스럽게 어울리도록 디자인되었고, Swift는 포인터를 파라미터로 일부 다루고 있다.

포인터와 in/out 파라미터

C와 Objective-C의 함수는 복수의 값을 리턴하지 못하기 때문에 부가정보를 함수 외부로 내보내기 위해서 포인터를 사용한다. Swift는 이런 경우 inout 어트리뷰트를 가진 파라미터를 정의할 수 있어서 Swift에서는 & 문법을 사용하여 var 변수의 포인터를 넘겨줄 수 있다. 예를 들어 UIColorgetRed(_:green:blue:alpha:) 메소드는 4개의 CGFloat* 포인터를 받는데 이는 다음과 같이 사용하여 4개의 변수에 대해 각 컬러 값을 얻어낼 수 있다.더 보기 »Swift – Interacting with C Pointers