검색결과 리스트
스위프트2에 해당되는 글 6건
- 2015.11.10 [swift2] Core Image Filter 예제
- 2015.08.27 [swift2] Xcode7 beta6 Swift 언어 변경사항
- 2015.07.30 [swift2] Xcode7 beta4 Swift 언어 변경사항
- 2015.06.24 [swift2] Xcode7 beta2 Swift 언어 변경사항
- 2015.06.19 [swift2] New in Swift2.0
- 2015.06.10 [swift] Apple Swift Blog
글
[swift2] Core Image Filter 예제
절차지향 또는 객체지향 프로그래밍에 익숙한 상태에서, 함수형 프로그래밍에 적응하기란 쉽지 않습니다. 다른 프로그래밍 방법론을 공부했을 때처럼 많은 함수형 프로그램 코드를 읽고 이해하고, 또 많은 예제를 실제로 작성해봐야만 숙달될 수 있습니다.
swift 함수형 프로그램의 예로 Core Image 필터 예제를 소개합니다. 이 예제는 objc.io 에서 출판된 Funtional Programming in Swift 에서 발췌하였습니다.
- 이 예제에서는 MaxOSX Core Image 프레임워크의 함수형 wrapper API 작성을 목표로 합니다.
- 또한 고차원함수(high-order function)와 같은 함수형 프로그래밍의 실질적인 활용예를 보는 것입니다.
Core Image
- Core Image는 강력한 이미지 프로세싱 프레임워크지만 사용하기가 불편합니다.
- Core Image API는 키밸류 코딩을 사용해서 설정할 수 있는 느슨하게 타이핑된 API 입니다.
- 파라미터 이름을 입력할 때 실수할 수 있는 여지가 많아 런타임 에러를 발생시킬 수 있습니다.
- 이번에 개발할 API 는 안전하고, 모듈화되었으며, (오타로 인한)런타임 에러가 발생하지 않도록 타입을 장점을 활용합니다.
Filter Type
- Core Image의 핵심클래스는 이미지 필터를 생성하는데 사용하는 CIFilter 클래스입니다.
- CIFilter 객체 생성시 반드시 kCIInputImageKey 키에 해당하는 input image를 전달해야합니다.
- kCIOutputImageKey 키를 사용해서 필터가 적용된 결과 이미지를 얻어올 수 있습니다.
- 또한 이 결과 이미지는 다른 필터의 입력으로 사용할 수 있습니다.
CIImage 타입을 파라미터로 받아 CIImage 타입의 결과 이미지를 반환하는 함수타입 Filter를 정의합니다.
typealias Filter = CIImage -> CIImage
Blur 필터 함수
- 이미지에 블러를 적용하는 blur 함수를 정의해보겠습니다.
- 이 블러필터는 한개의 blur radius 파라미터를 받습니다.
func blur(radius:Double) -> Filter {
return { image in
let parameters = [
kCIInputRadiusKey : radius,
kCIInputImageKey : image
]
let filter = CIFilter(name: "CIGaussianBlur", withInputParameters: parameters)
return filter!.outputImage!
}
}
- blur 함수는 CIImage 타입의 이미지를 인자로 받고, 결과 이미지(filter!.outputImage)를 리턴하는 Filter 함수를 반환합니다.
Color Overlay 필터 함수
- 이미지 위에 특정 컬러 레이어로 덮는 오버레이 필터를 정의해보겠습니다.
- CoreImage 에는 오버레이 필터가 없지만 이미 있는 필터들을 조합하여 만들것입니다.
- 컬러를 생성하는 color generator 필터와 레이어를 얹는 source-over compositing 필터를 사용하겠습니다.
Color 레이어 생성필터
func colorGenerator(color:NSColor) -> Filter {
return { image in
let parameters = [kCIInputColorKey:CIColor(color: color)!]
let filter = CIFilter(name: "CIConstantColorGenerator", withInputParameters: parameters)
return filter!.outputImage!.imageByCroppingToRect(image.extent)
}
}
- blur 필터와 유사하지만 input 이미지가 필요하지 않다는 차이가 있습니다.
- 생성된 컬러 레이어 이미지를 특정크기(인자로 받은 이미지의 크기)로 잘라주어야 합니다.
- 다음으로 두 이미지를 복합하는 필터를 정의합니다.
레이어 오버필터
func compositeSourceOver(overlay:CIImage) -> Filter {
return { image in
let parameters = [
kCIInputBackgroundImageKey: image,
kCIInputImageKey: overlay
]
let filter = CIFilter(name: "CISourceOverCompositing", withInputParameters: parameters)
return filter!.outputImage!.imageByCroppingToRect(image.extent)
}
}
- 마지막에 input 이미지의 크기만큼 결과 이미지를 자릅니다.
- 두 필터를 결합하여 color overlay 필터를 생성합니다.
Color Overlay 필터
func colorOverlay(color:NSColor) -> Filter {
return { image in
let overlay = colorGenerator(color)(image)
return compositeSourceOver(overlay)(image)
}
}
- colorOverlay 함수는 컬러를 인자로 받아 필터함수를 반환합니다.
- 이 필터함수에 이미지를 전달하면, 앞서 전달한 컬러로 오버레이된 이미지를 반환합니다.
Filter 복합하기
- blur 필터와 color overlay 필터를 복합해서 사용해보겠습니다.
- 원본 이미지 파일을 읽습니다.
let path = NSBundle.mainBundle().pathForResource("16.jpg", ofType: nil)!
let image = CIImage(contentsOfURL: NSURL(fileURLWithPath: path))!- blur 필터를 적용합니다.
let blurRadius = 5.0
let blurredImage = blur(blurRadius)(image)- 빨간색 레이어를 오버레이합니다.
let overlayColor = NSColor.redColor().colorWithAlphaComponent(0.2)
let overlaidImage = colorOverlay(overlayColor)(blurredImage)Function Composition
- 위 예제처럼 두 필터함수를 한문장의 표현식으로 표현할 수 있습니다.
let result = colorOverlay(overlayColor)(blur(blurRadius)(image))
- 하지만 여러 괄호들로 인해 조합된 필터의 수가 많아질 수록 가독성이 나타집니다.
- 더 좋은 방법은 필터 조합을 위한 커스텀 연산자를 정의하는 것입니다.
- 먼저 필터를 조합하는 함수를 정의해보겠습니다.
func composeFilters(filter1 filter1:Filter, filter2:Filter) -> Filter {
return { image in filter2(filter1(image)) }
}
- 위 함수는 두개의 필터를 인자로 받아 조합하여 새로운 필터를 정의합니다.
- 반환된 필터 함수는 CIImage 타입의 image 인자를 filter1과 filter2에 순차적으로 전달합니다.
- 아래와 같이 사용할 수 있습니다.
let myFilter1 = composeFilters(filter1: blur(blurRadius), filter2: colorOverlay(overlayColor))
let result1 = myFilter1(image)
- 이제 필터 조합을 위한 연산자를 정의하여 좀더 가독성 있게 만들어보겠습니다.
- 모든 곳에 자체 연산자를 정의할 필요는 없지만, 필터 조합은 이미지 처리 라이브러리에서 반복해서 발생하는 작업이기 때문에 그 용도가 적합합니다.
infix operator >>> { associativity left }
func >>> (filter1:Filter, filter2:Filter) -> Filter {
return { img in filter2(filter1(img)) }
}
- 이제 >>> 연산자를 이전에 정의했던 composeFilters 함수처럼 사용할 수 있습니다.
let myFilter2 = blur(blurRadius) >>> colorOverlay(overlayColor)
let result2 = myFilter2(image)
- >>> 연산자를 left-associativity 로 정의했기 때문에, 유닉스 파이프처럼 왼쪽에서 오른쪽으로 필터가 적용됩니다.
- 우리가 정의한 필터 조합은 Function Composition 의 한 예입니다.
전체소스
import Cocoa
import XCPlayground
// define Filter Type
typealias Filter = CIImage -> CIImage
// blur function
func blur(radius:Double) -> Filter {
return { image in
let parameters = [
kCIInputRadiusKey : radius,
kCIInputImageKey : image
]
let filter = CIFilter(name: "CIGaussianBlur", withInputParameters: parameters)
return filter!.outputImage!
}
}
// color layer function
func colorGenerator(color:NSColor) -> Filter {
return { image in
let parameters = [kCIInputColorKey:CIColor(color: color)!]
let filter = CIFilter(name: "CIConstantColorGenerator", withInputParameters: parameters)
return filter!.outputImage!.imageByCroppingToRect(image.extent)
}
}
// overlay function
func compositeSourceOver(overlay:CIImage) -> Filter {
return { image in
let parameters = [
kCIInputBackgroundImageKey: image,
kCIInputImageKey: overlay
]
let filter = CIFilter(name: "CISourceOverCompositing", withInputParameters: parameters)
return filter!.outputImage!.imageByCroppingToRect(image.extent)
}
}
// color overlay function
func colorOverlay(color:NSColor) -> Filter {
return { image in
let overlay = colorGenerator(color)(image)
return compositeSourceOver(overlay)(image)
}
}
// 원본 이미지 읽기
let path = NSBundle.mainBundle().pathForResource("16.jpg", ofType: nil)!
let image = CIImage(contentsOfURL: NSURL(fileURLWithPath: path))!
// apply blur
let blurRadius = 5.0
let blurredImage = blur(blurRadius)(image)
// apply color overlay
let overlayColor = NSColor.redColor().colorWithAlphaComponent(0.2)
let overlaidImage = colorOverlay(overlayColor)(blurredImage)
// define composition function
func composeFilters(filter1 filter1:Filter, filter2:Filter) -> Filter {
return { image in filter2(filter1(image)) }
}
let myFilter1 = composeFilters(filter1: blur(blurRadius), filter2: colorOverlay(overlayColor))
let result1 = myFilter1(image)
// define composition operator
infix operator >>> { associativity left }
func >>> (filter1:Filter, filter2:Filter) -> Filter {
return { img in filter2(filter1(img)) }
}
let myFilter2 = blur(blurRadius) >>> colorOverlay(overlayColor)
let result2 = myFilter2(image)
'Swift' 카테고리의 다른 글
| [swift2] 키워드로 보는 Swift (0) | 2015.11.30 |
|---|---|
| [swift2] Currying 함수 (0) | 2015.11.25 |
| [swift2] Core Image Filter 예제 (0) | 2015.11.10 |
| [swift2.1] Xcode7.1 Playground 변경사항 (0) | 2015.10.27 |
| [swift2] Functor 와 Monad (0) | 2015.10.25 |
| [swift2] 타입변환 연산자 (is, as, as?, as!) (0) | 2015.10.18 |
설정
트랙백
댓글
글
[swift2] Xcode7 beta6 Swift 언어 변경사항
Swift Language Enhancements and Changes
1. try? 키워드가 추가되었습니다.
- try? 구문은 에러를 던질수도 있는 연산을 수행합니다.
- 연산이 성공하면 결과는 optional로 랩핑되어 반환되고, 에러가 throw 되면 결과는 nil를 반환하고 error는 버려집니다.
- try?는 if let과 guard 문과 함께 사용될 때 특히 유용합니다.
func produceGizmoUsingTechnology() throws -> Gizmo { … }
func produceGizmoUsingMagic() throws -> Gizmo { … }
if let result = try? produceGizmoUsingTechnology() { return result }
if let result = try? produceGizmoUsingMagic() { return result }
print("warning: failed to produce a Gizmo in any way")
return nil
- try?에 의해 평가되는 표현식의 결과타입에 항상 optional이 추가된다는 것을 주목하세요.
- throwing 함수의 반환타입이 Int?이면, try?와 함께 함수를 호출한 결과는 Int?? 또는 'Optional<Optional
>' 이 됩니다.
2. Xcode는 . 문법을 사용할 때, 문맥을 인식한 enum 엘리먼트와 option sets의 코드완성 기능을 제공합니다.
3. 프로토콜 extension Static 계산속성을 정의할 수 있습니다.
4. 함수 또는 생성자 파라미터 리스트 어떤 위치에도 가변인자가 올 수 있습니다.
func doSomethingToValues(values: Int..., options: MyOptions = [], fn: (Int) ->
Void) {
// function body
}
5. Objective-C와 호환되지 않는 타입을 포함하는 컬렉션은 더이상 Objective-C 호환타입으로 간주되지 않습니다.
- 이전에는 Array
구문은 @objc가 마킹된 프로퍼티로 허용되었지만, 그러한 케이스는 더이상 허용되지 않습니다.
6. C typdefs으로 선언된 block은 이제 Swift 클로져 typealias로 임포트됩니다.
- BOOL 타입 파라미터가 사용된 typedefs 블럭은 Bool 타입 파라미터를 가진 클로져로 임포트됩니다.(이전 베타5에서는 ObjCBool 파리미터로 되었음.)
- 이것은 블럭 파라미터의 행동과 임포트된 Objective-C 메서드를 매칭시킵니다.
7. 타입체커가 생성한 에러메시지는 구체적이고 유용하게 개선되고 있습니다.
- 진단시에, type alias를 사용했다면 별칭(aka)을 출력합니다.
Swift Standard Library Enhancements and Changes
1. print()와 debugPrint()가 개선되었습니다.
- 가변인자 지원하여, 한번의 호출로 여러개의 아이템을 출력할수 있습니다.
- separator: String = " " 가 추가되어, 어떻게 아이템이 구분되는지 제어할 수 있습니다.
- appendNewline:bool = true 는 terminator:String = "\n"로 교체되었습니다.
- output stream을 인자로 받는 print 함수에는 stream 인자에 toStream 레이블을 추가했습니다.
2. RangeReplaceableCollectionType.extend() 메소드가 appendContentsOf()로 이름이 변경되었습니다.
- splice() 메서드는 insertContentsOf()로 이름이 변경되었습니다.
3. 클로져와 @autoclosure 인자를 갖는 대부분의 표준라이브러리 API은 이제 rethrows를 사용합니다.
- map과 filter 같은 메서드의 클로져 파라미터들이 에러를 throw할 수 있게 허용합니다.
- 에러를 발생시킬 수 있는 표현식과 &&, ||, ?? 같은 short-circuiting 연산자를 함께 사용할수 있습니다.
4. 모든 CollectionType은 이제 sliceable 합니다.
- 다음 sequence spllitting/slicing 함수들은 SequenceType 프로토콜 요구사항에 맞게 삭제되거나 프로토콜 extension 디폴트 구현으로 대체되었습니다.
/// Returns the first `maxLength` elements of `self`,
/// or all the elements if `self` has fewer than `maxLength` elements.
prefix(maxLength: Int) -> SubSequence
/// Returns the last `maxLength` elements of `self`,
/// or all the elements if `self` has fewer than `maxLength` elements.
suffix(maxLength: Int) -> SubSequence
/// Returns all but the first `n` elements of `self`.
dropFirst(n: Int) -> SubSequence
/// Returns all but the last `n` elements of `self`.
dropLast(n: Int) -> SubSequence
/// Returns the maximal `SubSequence`s of `self`, in order, that
/// don't contain elements satisfying the predicate `isSeparator`.
split(maxSplits maxSplits: Int, allowEmptySlices: Bool, @noescape isSeparator:
(Generator.Element) -> Bool) -> [SubSequence]
- split를 위해 다음 convenience extension을 제공합니다.
split(separator: Generator.Element, maxSplit: Int, allowEmptySlices: Bool) ->
[SubSequence]
- 또한 새로운 프로토콜 요구사항과 컬렉션 타입의 디폴트 구현이 사용가능합니다.
/// Returns `self[startIndex..<end]`
prefixUpTo(end: Index) -> SubSequence
/// Returns `self[start..<endIndex]`
suffixFrom(start: Index) -> SubSequence
/// Returns `prefixUpTo(position.successor())`
prefixThrough(position: Index) -> SubSequence
'Swift' 카테고리의 다른 글
| [swift2] Swift Guard (0) | 2015.09.11 |
|---|---|
| [swift2] Swift2에서의 문자열(strings) (0) | 2015.09.02 |
| [swift2] Xcode7 beta6 Swift 언어 변경사항 (0) | 2015.08.27 |
| [swift2] Xcode7 beta5 Swift 언어 변경사항 (0) | 2015.08.14 |
| [swift1.2] Swift 프로토콜 지향 프로그래밍 (0) | 2015.08.06 |
| [swift] 문자열과 문자 -1 (Strings and Characters) (0) | 2015.08.01 |
설정
트랙백
댓글
글
[swift2] Xcode7 beta4 Swift 언어 변경사항
드디어 Xcode7 beta4가 공개되었네요! beta4 에서 Swift 언어 변경사항에 대해 알아볼까요?
Objective-C Language Changes
1. 더블 언더스코어 nullability 한정자들 이름이 변경되었습니다.
- as is: __nullable, __nonnull, __null_unspecified
- to be: _Nullable, _Nonnull, _Null_unspecified
- 소스 호환성을 위해 컴파일러가더블 언더스코어 이름을 새로운 이름으로 맵핑하는 매크로를 정의해줍니다.(predefine)
Swift Language Changes
1. Enum과 Case에 indirect 키워드를 사용할 수 있습니다.
- indirect 키워드를 사용해서 재귀적인 데이터 구조를 정의할 수 있음.
- 재귀적인 데이터 구조 정의시 enum의 연관값은 간접적으로 저장됨
enum List<T> {
case Nil
indirect case Cons(head: T, tail: List<T>)
}
indirect enum Tree<T> {
case Leaf<T>
case Branch(left: Tree<T>, right: Tree<T>)
}
2. class 객체를 참조하는 AnyObject, NSObject 변수를 class Object 타입으로 복원이 가능합니다.
let x:AnyObject = NSObject.self // NSObject 클래스 객체를 AnyObject로 캐스팅
let y = x as! NSObject.Type // AnyObject를 NSObject 클래스 객체로 복원
3. class 객체를 포함하는 Array,Dictionary,Set 을 NSArray,NSDictionary,NSSet로 브리징할 수 있습니다.
- [NSURLSessionConfiguration protocolClasses]과 같이 NSArray * 객체를 반환하는 Objective-C API도 이제 Swift에서 정상동작합니다.
4. 클래스에 적용한 @objc 속성은 Objective-C 헤더에 생성된 클래스의 컴파일타임 이름 뿐만 아니라 런타임 이름도 변경합니다.
- 프로토콜에도 적용됨
// Swift
@objc(MyAppDelegate)
class AppDelegate : NSObject, UIApplicationDelegate {
//...
}
// Objective-C
@interface MyAppDelegate : NSObject <UIApplcationDelegate>
// ...
@end
5. 스칼라값의 0 엘리먼트를 참조하는 기능은 제거되었습니다.
6. 타입검사 제약시스템이 생성한 에러 진단메시지가 beta4에서 개선되었습니다. 이후 베타버전에서 더 많은 부분들이 개선될 예정입니다.
7. SinkType 프로토콜과 SinkOf 구조체가 표준 라이브러리에서 제거되고 대신 (T) -> () 클로져를 사용합니다.
8. ExtensibleCollectionType 부모프로토콜이 서브 프로토콜 RangeReplaceableCollectionType로 통함되었습니다.
- RangeReplaceableCollectionType 은 subRange를 다른 컬렉션의 엘리먼트들로 교체를 지원하는 컬렉션 타입.
- 기본구현을 위한 메소드들이 추가됨.
- 이 프로토콜들과 연관된 (free) Swift 모듈 함수들 대신 이 메서드들을 사용할 수 있습니다.
9. Unmanaged를 사용한 속성과 메서드들도 Objective-C에 노출가능합니다.
- Unmanaged는 unmananged 객체 레퍼런스를 전달하기 위한 타입.
- 이 타입을 사용하면 객체가 살아있도록 유지할 책임이 있음.
10. performSelector 류의 API 들 Swift 코드에서 사용가능합니다.
11. __unsafe_unretained로 마크된 C 구조체 필드는 Swift에 Unmanaged 로 표시됩니다.
- Swift 컴파일러는 이 참조들이 실제로 strong(+1) 또는 unretained(+0)로 의도되었는지는 알수 없음.
12. Swift 문서 주석들은 최상위 목록아이템을 인식합니다.
- Throws: ... 구문은 어떤 에러가 왜 던져질수 있는지 문서화하기 위해 사용합니다.
- Xcode QuickHelp의 파라미터 및 반환값 설명 옆에 표시됩니다.
13. 타입은 그 타입보다 더 낮은 버전에서 가용한 프로토콜을 구현할 수 있습니다.
@available (iOS 9.0, *)
protocol P { ... }
@available (iOS 7.0, *)
class MyController : UIViewController, P {
...
}
'Swift' 카테고리의 다른 글
| [swift1.2] Swift 프로토콜 지향 프로그래밍 (0) | 2015.08.06 |
|---|---|
| [swift] 문자열과 문자 -1 (Strings and Characters) (0) | 2015.08.01 |
| [swift2] Xcode7 beta4 Swift 언어 변경사항 (0) | 2015.07.30 |
| [swift] 성능향상 시키기 - 다이나믹 디스패치를 최소화 (0) | 2015.07.16 |
| [swift2] Xcode7 beta3 Swift 언어 변경사항 (0) | 2015.07.11 |
| [swift2] Swift에서 에러 처리 (Error Handling) (0) | 2015.07.10 |
설정
트랙백
댓글
글
[swift2] Xcode7 beta2 Swift 언어 변경사항
Swift Language Changes
- payload를 가진 Enum case들은 함수처럼 사용될수 있습니다.
enum Either<T, U> {
case Left(T), Right(U)
}
let lefts: [Either<Int, String>] = [1, 2, 3].map(Either.Left)
let rights: [Either<Int, String>] = [“one”, “two”, “three”].map(Either.Right)
// => {{Left 1}, {Left 2}, {Left 3}}
- 구조체, enum, 프로토콜의 non-mutationg 메소드들에 부분적으로 self 파라미터가 적용됩니다.
let a: Set<Int> = [1, 2, 3]
let b: [Set<Int>] = [[1], [4]]
b.map(a.union)
// => [[1, 2, 3], [1, 2, 3, 4]]
- 정적타입 참조 또는 타입객체에 static 메소드처럼 .init를 사용하여 생성자를 초기화함수에 접근할 수 있습니다.
let x = String.init(5)
let stringType = String.self
let y = stringType.init(5)
let oneTwoThree = [1, 2, 3].map(String.init).reduce(“”, combine: +)
// => "123"
String(5) 처럼 정적타입을 사용해서 생성할때도 여전히 .init은 암묵적으로 호출됩니다. .init은 동적타입 객체를 사용할 때, 함수인자로 initializer를 참조할 때 사용됩니다.
거대한 구조체 또는 enum 타입의 코드를 생성할 때 코드 크기를 감소시키도록 개선되었습니다.
이제 Swift는 assertion이 활성화 된채 빌드됩니다. 실용적인 crash report를 생성하는데 도움이 될것입니다.
- 실행결과
'Swift' 카테고리의 다른 글
| [swift2] Swift에서 에러 처리 (Error Handling) (0) | 2015.07.10 |
|---|---|
| [swift2] 타입의 텍스트적인 표현 커스터마이징하기 (0) | 2015.07.01 |
| [swift2] Xcode7 beta2 Swift 언어 변경사항 (0) | 2015.06.24 |
| [swift] 문자열 Indexing과 Slicing (0) | 2015.06.23 |
| [swift] Map, Filter, Reduce (0) | 2015.06.22 |
| [swift2] New in Swift2.0 (0) | 2015.06.19 |
설정
트랙백
댓글
글
[swift2] New in Swift2.0
올 가을 Swift2.0 정식버전이 발표된다고 합니다. Xcode7 beta Release Notes를 통해 그 변경사항을 잠시 알아볼까요?
원문: Xcode7 beta Release Notes
Swift Language Features
1. 에러처리
에러를 throw, catch 그리고 관리하는 함수를 생성할 수 있습니다. file-not-found 에러 혹은 네트워크 타임아웃
같은 회복가능한 에러를 처리하고, 의도를 명확하게 드러낼 수 있습니다. Swift 에러 처리는 NSError와 상호동작합니다.
2.가용성 체크
선택된 deployement target 보다 더 신버전의 운영체제에서 지원하는 API를 호출하면
Swift는 컴파일 타임에 에러를 보고합니다. 런타임에 영속적으로 사용 불가능한 API를 검사하려면,
if 또는 guard 문에서 새롭게 추가된 available()조건을 사용하세요.
if #available(iOS 8.0, OSX 10.10, *) {
// Use Handoff APIs when available.
let activity = NSUserActivity(activityType:"com.example.ShoppingList.view")
activity.becomeCurrent()
} else {
// Fall back when Handoff APIs not available.
}
3. @available() 속성
함수 선언부에 @available() 속성을 사용하여 가용성 정보를 명시할 수 있습니다.
// iOS 8.0 이상, OSX 10.10 이상, 다른 플랫폼의 모든 버전에서 사용가능합니다.
@available(iOS 8.0, OSX 10.10, *)
func startUserActivity() -> NSUserActivity {
...
}
4. 프로토콜 Extensions
프로토콜 타입을 위한 Extensions을 작성할 수 있습니다. 특정 프로토콜를 따르는 어떠한 타입에도 메서드와 속성을 추가
할 수 있게되어 더 많은 코드를 재사용 할수 있습니다. 유연한 인터페이스 원칙에 따라 호출 측의 dot 메서드 문법을 더 자연스럽게 하고,
제네릭 코드 정의를 더 단순하게 합니다.
5. 프로토콜 디폴트 구현
프로토콜은 프로토콜 extension 명세에 따른 기본 구현체를 가질 수 있습니다. mixin, trait 같은 패턴구현이 가능해집니다.
func xyz() throws {
6. defer 구문
defer 구문은 scope를 빠져나올때 클린업 코드를 실행합니다. 특히 새 에러처리 모델과 결합하여 사용하면 유용합니다.
let f = fopen("x.txt", "r")
defer { fclose(f) }
try foo(f) // 에러가 발생하면 f가 닫힘
let f2 = fopen("y.txt", "r")
defer { fclose(f2) }
try bar(f, f2) // 에러가 발생하면 f2가 닫히고, f가 닫힘
}
// 정상흐름에선 f2가 닫히고, 그다음 f가 닫힘
7. guard 구문
scope를 조기에 빠져나갈 수 있게합니다.
(의도하지 않는 조건에선 조기에 scope를 빠져나가게 하여, 다음 코드를 신경쓰지 않도록 해준다는 내용입니다.)
guard let z = bar() else { return }
use(z)
scope를 빠져나가기 위해 else 블럭이 필요합니다. (예를 들면 return,throw,break,continue와 함께)
8. 패턴매칭 향상
switch/case 패턴매칭이 if/case, while/case, guard/case, 그리고 for-in/case를 포함하여
많은 새로운 조건 제어구문에서 사용가능합니다. for/in 문은 where 절을 가질수 있습니다.
9. do 구문
do 구문을 사용하여 새로운 scope를 정의할수 있습니다.
do {
//new scope
do {
//another scope
}
}
10. 테스트성 향상
Swift2.0 프레임워크와 앱들의 테스트(코드)들은 내부 루틴을 public 으로 만들지 않고 작성되었습니다.
테스트 소스코드에서 모든 것을 public으로 만들어 내부 루틴을 사용할 수 있게 만들어주는 다음 구문을 사용하세요.
@testable import { ModuleName }
앱과 프레임워크 타겟은 "Enable Testability" 빌드설정을 활성화하고 컴파일 해야합니다.
Enable Testability 설정은 앱과 프레임워크의 모든 내부 심볼들까지 exporting 할지 결정하여 최적화를 막을 수 있기때문에
Debug configuration 에서만 사용되야 합니다.
11. C 함수포인터 Native 지원
함수포인터를 인자로 갖는 C함수는 clusers 또는 글로벌 함수를 사용하여 호출할 수 있습니다.
// 표준C qsort
var array = [3, 14, 15, 9, 2, 6, 5]
qsort(&array, array.count, sizeofValue(array[0])) { a, b in
return Int32(UnsafePointer<Int>(a).memory - UnsafePointer<Int>(b).memory)
}
print(array)
12. 진단기능 향상
var 대신 let 사용을 권장하기 위한 새로운 warning과 unused variables warning이 추가되었습니다.
invalid mutation warning 진다는 보다 더 정밀해졌으며, unreachable switch cases 절도 warning을
발생시킵니다.
13.enum 다중 제네릭 연관값을 지원
enum Either<T, U> {
case Left(T), Right(U)
}
13. enum 프린팅 구문 - enum case와 playload 출력 (가능한 경우에만)
@objc enum과 다중 payload를 갖는 enum 에는 적용되지 않습니다.
14. 제네릭 타입의 public extension 허용
public extension Array { … }
15. 제네릭 클래스로부터 non 제네릭 클래스 상속이 가능
16. swift 문자열 접합연산 - 컴파일 타임에 최적화를 보장
17. 실패 가능한 Convenience 생성자에서 self.init 호출전에 nil 리턴 허용
여전히 Designated 생성자들은 nil을 리턴하기 전에 모든 저장속성들을 초기화 해야합니다.
18. 중첩함수는 재귀적으로 자기자신과 다른 중첩함수들을 참조 가능
19. if 문에 라벨링 가능
라벨이 있는 break 문은 매칭되는 if문 밖으로 jump 하는데 사용됩니다.
라벨이 없는 break 문은 if문을 종료시키지 못하지만, 루프문과 스위치 구문은 종료시킵니다.
20. x? 패턴
.Some(x) 와 동일한 의미로 optional에 붙어 x? 패턴을 사용할수 있습니다.
21. 인스턴스 멤버에 @objc 키워드가 붙는 것을 방지해주는 @nonobjc 속성 추가
(Swift 코드를 Objective-C에 노출시킬 때, @nonobjc 속성이 붙은 속성과 메소드는 노출되지 않습니다.)
22. 표준 라이브러리에 readLine() 추가
'Swift' 카테고리의 다른 글
| [swift] 문자열 Indexing과 Slicing (0) | 2015.06.23 |
|---|---|
| [swift] Map, Filter, Reduce (0) | 2015.06.22 |
| [swift2] New in Swift2.0 (0) | 2015.06.19 |
| [swift] Apple Swift Blog (0) | 2015.06.10 |
| [swift] Swift 기초 - 4 (0) | 2014.10.29 |
| [swift] Swift 기초 - 3 (1) | 2014.10.29 |
설정
트랙백
댓글
글
[swift] Apple Swift Blog
애플 WWDC 2015 에서 Swift2 공개와 올해 말 오픈소스화 발표가 있었습니다.
애플 swift 블로그를 방문하니 역시나 새롭게 단장되어있네요. Swift2 의 변화를 훑어보기 위해 대문 페이지를 번역해보았습니다.
[출처]: Apple Swift blog
Swift. 안전하고, 빠르며, 인터렉티브한
최신의 프로그래밍 언어
Swift는 iOS, OS X, watchOS를 위한 강력하고 직관적인 프로그래밍 언어입니다.
Swift 코드를 작성하는 것은 인터렉티브하고, 재미있습니다. 문법은 간결하지만 표현력이 풍부하며,
앱은 번개처럼 빠르게 실행됩니다. Swift는 당신의 다음 프로젝트 - 또는 현재 앱에도 사용할수 있도록
준비되어있습니다. - 왜냐하면 Swift는 Objective-C 와 함께 동작하기 때문이지요.
Swift 2 소개
Swift 는 밑바닥부터 개선되었습니다. 릴리즈, 디버그 빌드를 막론하고 더 빠른 코드를 생성합니다.
Swift 컴파일러는 var 대신 let를 사용하라는 새로운 Fix-it 제안을 제공해주는데도 더 빠릅니다.
주석에 마크다운를 사용하여 rich text와 내장 이미지를 추가할 수 있습니다.
새로운 assistant는 header-like 뷰에서 Swift API를 보여줍니다. 그리고 Cocoa 프레임워크와 Objective-C
코드를 더 풍부하고 훨씬 안정성있게 해주는 새로운 문법들이 개선되었습니다.
에러처리 모델(Error Handling Model)
진보된 에러처리 모델은 에러를 캐치하고 던지는 명확하고, 풍부한 문법을 제공합니다.
쉽게 커스텀 에러타입을 정의하고 명확하고 의미있는 이름으로 에러 케이스를 기술할 수 있습니다.
새로운 에러모델은 NSError 클래스와 Cocoa 프레임워크와 잘 조화되도록 설계되었습니다.
에러 처리 코드의 예입니다.
개선된 문법(Syntax improvements)
새로운 문법 특징들은 언어를 일관성 있게 개선하면서도 더 풍부한 코드를
작성할 수 있게 합니다. SDK는 Objective-C에, Swift를 더 명확하고 안전하게 하는
generics와 nullability 어노테이션을 도입했습니다.
Swift 2.0에 개선된 몇가지 예입니다.
- do, guard, defer, repeat를 사용한 강력한 제어흐름
- 함수와 메서드 키워드 네이밍 규칙 통합
- 프로토콜 extension 과 디폴트 구현
- if문과 for 루프에서의 확장된 패턴매칭
Xcode7는 애플리케이션과 playground 코드를 최신 Swift2.0 의 개선된 문법으로
변환해주는 강력한 마이그레이터를 포함합니다.
가용성(Availability)
최신의 특징, 문서, API 변경사항을 접근하기 위해서 최신의 SDK를 사용해야 했지만
때때로 앱이 더 이전 버전의 OS 에서 실행되야할 때가 있습니다.
Swift2.0은 가용성 체킹 기능을 가지고 있습니다. 이 기능은 각 target OS version 에
가장 적합한 앱을 쉽게 빌드할 수 있게 해줍니다. 컴파일러는 최소 OS 타겟에서는 지원하지 않는
새로운 api를 사용하려 할때 에러를 발생시킵니다.
그리고 특정 버전의 OS에서만 실행되도록 버전분기를 해주는 코드블럭를
랩핑하는 키워드들 제공합니다.
오픈소스(Open Source)
올해 말 Swift는 오픈소스로 릴리즈 됩니다.
우아하고, 강력하고 안전한 Swift의 결정체가 산업 전반에 소개될 수 있는
기회를 제공합니다. 우리가 함께 개발하는 것을 상상하니 흥미진진합니다.
모던(Modern)
Swift는 수십년의 애플 플랫폼 개발 경험과 가장 최신의 프로그래밍 언어 연구결과의 집합체입니다.
Objective-C에서 차용한 named 파라미터는 명확한 문법으로 표현하되, 가독성과 유지보수를 쉽게합니다.
타입추론은 모듈이 헤더를 제거하고 네임스페이스를 제공하면서, 코드를 더 깔끔하게 하고, 그리고 실수를 덜
유발하게 합니다. 메모리는 자동으로 관리되며, 세미콜론 조차 타이핑 할 필요 없습니다.
모든 이런 현대적인 아이디어들이 언어를 쉽고, 사용하기 재미있게 만들어줍니다.
Swift는 코드를 더 풍부하게 하는 다른 많은 특징들을 가지고 있습니다.
- 클로저는 함수 포인터와 통합되었습니다.
- 튜플과 다중 리턴값
- 제네릭
- 빠르고 간결한 range와 collection iteration
- 메서드, extension, 프로토콜을 지원하는 구조체
- map, filter와 같은 함수형 프로그래밍 패턴
- try/catch/throw 를 사용하는 네이티브 에러처리
| 인터렉티브 플레이그라운드 (Interactive Playgrounds) |
Playgrounds 는 Swift 코드 작성을 믿을수 없을 정도로 단순하고 재미있게 합니다.
한 줄의 코드 타이핑 결과가 즉시 나타납니다. 코드 오른편에서 빠르게 결과를 훑어보거나,
그 결과를 바로 아래에 고정할수 있습니다. 결과뷰는 그래픽, 결과리스트, 시간의 흐름에 따른 그래프로
볼수 있습니다. Time Assistant를 열어 관련된 뷰들이 변화하고 애니메이션 되는것을 볼수 있습니다.
새로운 UI코드를 실험하고, 코딩하면서 애니메이션 되는 SpriteKit Scene을 실행해보기 좋습니다.
Playground에서 코드작성을 완료했을 때, 단순히 프로젝트로 코드를 옮기세요.
Xcode7의 새로운 기능중 하나로 Playgrounds는 이탤릭 볼드, 불릿 리스트, 내장이미지와 링크 등을 가진
rich text를 사용하여 주석을 달수 있습니다. 심지어 리소스도 내장할수 있어서 코드는 단순하게 하면서도
Swift 소스 코드를 믿을수 없을 정도로 강력하고 매력적이게 할수 있습니다.
아름다운 텍스트와 인터렉티브한 코드를 사용하여 프로그래밍 커리큘럼을 공유할 수 있습니다.
새로운 알고리즘을 설계하고, 단계마다 그 결과를 볼수 있습니다.
테스트 슈트를 만들기 전에 새로운 테스트를 작성하고 동작하는지 검증할 수 있습니다.
Swift 코딩 기술을 연마하기 위해 새로운 API를 실험해볼 수 있습니다.
실험결과를 Playgrounds 안에서 동작하는 코드예제를 갖는 문서로 만들 수 있습니다.
Read-Eval-Print-Loop(REPL)
Xcode의 LLDB 디버깅 컨솔은 Swift 언어의 인터렉티브한 버전을 포함하고 있습니다.
스위프트 문법을, 실행되고 있는 앱과 상호작용하고 evaluate하는데 사용해보세요.
또 스크립트 같은 환경에서는 어떻게 동작하는지 새로운 코드를 작성해보세요.
Xcode 컨솔과 터미널에서 사용가능합니다.
안정성을 위한 설계(Designed for Safety)
Swift는 불안전한 코드들을 제거했습니다. 변수는 사용하기 전에 초기화 되어야 하고,
배열과 정수타입은 오버플로그 검사를 하며 메모리는 자동으로 관리됩니다.
문법은 의도를 잘 드러내도록 튜닝되었습니다.
예를 들어 단순하게 3문자 키워드를 사용하여 변수(var) , 상수(let)를 선언합니다.
또 다른 사례로, 디폴트로 Swift 객체는 nil이 될 수 없습니다.
Swift 컴파일러는 컴파일 타임 에러로 객체가 nil이 되는 것을 예방합니다.
이것이 코드작성을 훨씬 명확하게 하고, 안전하게 합니다. 그리고 당신 앱의 수많은 종류의
런타임 크래시들을 예방해줍니다. 그러나 nil이 유효하고 적절한 값일 경우가 있습니다.
이런 상황에서는 optional이라고 알려진 혁신적인 특징을 사용합니다.
optional은 nil을 포함할 수 있으며, Swift 문법은 당신이 이해할 수 있고, 안전하게 처리할수 있도록
?구문을 사용하도록 강제합니다.
빠르고 강력하다(Fast and Powerful)
초기 컨셉부터 Swift는 속도를 염두해두고 개발되었습니다. 고성능 LLVM 컴파일러를 사용하여, Swift 코드는
대부분의 최신 하드웨어에 최적화된 네이티브 코드로 변환됩니다. 문법과 표준라이브러리는 코드가 가장 잘 실행되도록
튜닝되었습니다.
Swift는 C와 Objective-C 언어들을 계승합니다. 로우레벨 기본형 타입들과, 제어흐름, 연산자들을 포함하고 있습니다.
클래스, 프로토콜, 제네릭과 같은 객체지향 특징들은 Cocoa, Cocoa Touch 개발자들이 필요로 하는 성능과 힘을 제공합니다.
Objective-C 상호운영성 (Interoperability) |
Swift를 사용하여 전체 애플리케이션을 작성할 수 있습니다.
현재 앱의 새로운 기능 구현을 위해서 Swift코드를 사용할 수도 있습니다.
Swift 코드는 동일 프로젝트에 있는 Objective-C 파일들과 함께 존재하며, 전체 Objective-C API 에 접근하며 쉽게 적용할
수 있습니다.
'Swift' 카테고리의 다른 글
| [swift] Map, Filter, Reduce (0) | 2015.06.22 |
|---|---|
| [swift2] New in Swift2.0 (0) | 2015.06.19 |
| [swift] Apple Swift Blog (0) | 2015.06.10 |
| [swift] Swift 기초 - 4 (0) | 2014.10.29 |
| [swift] Swift 기초 - 3 (1) | 2014.10.29 |
| [swift] Swift 기초 - 2 (0) | 2014.10.29 |
