[아이폰] 글 목록

아이폰/글 목록 2015. 10. 17. 23:01

[iOS9] 3D Touch 시작하기

아이폰 2015. 10. 16. 01:26

애플개발자 라이브러리 Getting Started With 3D Touch를 번역한 글입니다.


iOS 9부터 새 아이폰 모델들의 유저인터페이스에 3차원 개념이 도입되었습니다.

  • 사용자는 앱 기능에 즉시 접근하기 위해 홈스크린 아이콘을 press 할수 있습니다.
  • 앱 안에서는, 컨텐츠를 미리보기하거나 특정 기능에 대한 빠르게 접근하기 위해 뷰를 press 할수 있습니다.


샘플코드를 참고하려면, 다음 Xcode 프로젝트를 다운로드 하세요.


홈스크린 퀵액션

사용자는 앱을 시작하기 위해 아이콘을 탭할 수 있고, 홈스크린을 편집하기 위해 앱아이콘을 터치 앤 홀드할수 있습니다. iPhone 6s, iPhone 6s Plus 에서는 앱 아이콘을 pressing 해서 퀵액션 집합을 볼수 있습니다. 사용자가 퀵액션을 선택하면 앱은 활성화되어 실행되고 app delegate는 퀵액션 메시지를 수신합니다.

가장 좋은 퀵액션은 사용자와 앱과의 인터랙션을 예측가능하게 합니다. iOS 9 SDK는 새 아이폰 모델에서 사용가능한 정적,동적 퀵액션을 정의하는 API들을 제공합니다.

두 타입의 퀵액션 모두 최대 두줄의 텍스트 라인과 옵셔널 아이콘을 노출합니다.


Peek 과 Pop

다양한 강도의 사용자 press 에 반응하도록 뷰컨트롤러들을 활성화할수 있습니다. 사용자가 더 깊이 press 할수록 3단계의 인터렉션이 처리됩니다.

  • 1단계: 컨텐츠 preview 사용가능이 표시됨
  • 2단계: 직접 수행할수 있는 옵션들(peek quick action)과 함께 preview가 보여짐(peek)
  • 3단계: preview 에서 보여졌던 뷰로 네비게이션됨(pop)

peek과 pop를 적용하면 시스템이 다음단계 전환에 대한 압력의 강도를 결정합니다. 사용자는 Settings > Accessibility > 3D Touch 에서 전환에 대해 조정할수 있습니다.


Peek 가용유무 표시
  • 가볍게 누르면, 주변 컨텐츠가 블러처리 되면서 추가컨텐츠 미리보기 가능함이 표시됩니다.



Peek
  • 좀더 깊게 누르면, preview 로 전환됩니다. preview는 일반적으로 더 많은 컨텐츠를 보여주도록 구성됩니다.(그림은 메일앱)
  • 사용자가 이 시점에 터치를 멈추면 peek 은 사라지고, 앱은 이전 상태로 되돌아갑니다.
  • 대신 좀더 깊게 누르면, 시스템이 제공하는 pop 전환을 사용하여 preview가 네비게이션되고, pop 뷰는 앱 루트뷰를 채우고 네비게이션 백버튼이 노출됩니다. (마지막 단계의 pop view 사진은 표시하지 않았음)


Peek quick actions
  • 터치를 멈추지 않고 preview 위쪽으로 스와이프하면, 시스템은 preview 와 연관있는 peek 퀵액션을 노출합니다.
  • 각 peek 퀵액션은 앱에 대한 딥링크입니다.
  • 일단 peek 퀵액션이 화면에 노출되면, 사용자가 터치를 멈추어도 preview 는 퀵액션을 탭 할때까지 화면에 남아있습니다.


웹뷰 내의 링크들에 대한 peek과 pop도 활성화 할수 있습니다. Web View Peek and Pop 를 참고하세요.


Force Properties

  • iOS 9 부터 UITouch 클래스는 3D Touch 커스텀 구현을 지원하기 위한 2개의 새로운 속성인 forcemaximumPossibleForce 를 갖습니다.
  • iOS 디바이스에 최초로, 이 속성들은 앱이 수신하는 UIEvent 객체안에서 터치압력을 탐지하고 반응할수 있게해줍니다.
  • 터치의 force는 매우 동적인 범위를 갖으며 부동소수로 표현됩니다.


접근성과 3D Touch 휴먼인터페이스 가이드라인

  • 모든 사용자가 앱의 피처에 접근할수 있도록 보장하기 위해서, 3D Touch 가용유무에 따라 코드를 브랜치하세요.
  • Checking for 3D Touch Availability 를 참고하세요.

3D Touch 는 3D Touch 디바이스들, 그리고 활성화 되었을 때에만 사용가능합니다. iOS 9 에서 3D 터치는 기본으로 활성화되어 있으며 Setting > Accessibility > 3D Touch 메뉴에서 비활성화 할수 있습니다.

  • 3D Touch 가 사용가능하면, 기능의 장점을 활용하세요. 사용가능하지 않다면, touch and hold 와 같은 대안을 제공하세요.
  • 3D Touch 기능은 VoiceOver를 지원합니다. VoiceOver 를 배우려면, Accessibility Programming Guide for iOS 를 참고하세요.
  • 3D Touch 와 함께 사용가능한 새로운 기능에 대한 가이드는 iOS Human Interface Guidelines 문서의 3D Touch 를 참고하세요.


개발환경

  • Xcode7 은 3D Touch 개발을 지원합니다. Xcode의 모든 디버깅 기능은 새 기능을 구현하는데 사용할 수 있습니다.
  • Xcode7과 함께 3D Touch 를 지원하는 디바이스 상에서 개발해야합니다. 시뮬레이터는 3D Touch를 지원하지 않습니다.
  • 코드로 peek 과 pop 뷰컨트롤러들을 구현해야합니다. 인터페이스 빌더는 3D Touch 전환과 뷰컨트롤러들 설정에 대한 그래피컬한 지원을 하지 않습니다.

  • 모든 기능을 모든 사용자들이 사용할수 있도록 3D Touch 활성화상태와 비활성상태 모두 테스트 해야합니다.

  • 3D Touch 디바이스의 Settings > General > Accessibility > 3D Touch 메뉴에서 비활성화 할수 있습니다.




[swift] Swift 코딩환경 Playground

Swift 2015. 10. 5. 02:12

Playground는 xcode6 부터 지원된 인터랙티브한 swift 코딩환경입니다. 애플 공식문서에서는 Playground 를 다음과 같이 소개하고 있습니다.


  • 프로젝트 전체를 컴파일하지 않고도 코드를 실행하고 결과를 보여주는 인터랙티브한 스위프트 코딩환경.
  • Swift 언어를 학습하고, 앱의 일부분을 프로토타이핑하고, 다른 사람들을 위한 학습환경을 만드는데 활용가능.
  • 알고리즘과 시스템 API를 실험하고 커스텀뷰 구현이 가능함.
  • 학습결과에 리치 코멘트로 노트와 가이드 작성가능.


참고

  • 이글은 Playground_Help 문서를 참고하여 작성했습니다.
  • Playground_Help


1. Playground 에디터 구성

playground 에디터는 아래 그림과 같이 구성되어 있습니다.



  • Source editor 에 타이핑한 결과는 즉시 Results sidebar 에서 확인할수 있습니다.
  • Result sidebar의 Quick Look  버튼을 누르면 팝업으로 결과를 확인할수 있습니다. 



  • Result  버튼을 누르면 Source editor 영역에 결과를 인라인으로 삽입할 수 있습니다. 



  • Console 영역에는 print, NSLog 함수가 출력한 문자열을 확인할수 있습니다.

    View > Show Debug Area 메뉴를 통해 표시.



  • Timeline 영역은 XCPlayground 모듈의 렌더링 결과를 표시합니다.

    View > Assitant Editor > Show Assistant Editor 메뉴를 통해 표시. 



2. 결과뷰 Display 방식 변경하기

  • 인라인으로 삽입된 결과뷰의 Display 방식을 변경할 수 있습니다.
  • 삽입된 결과뷰를 선택하고 오른쪽 클릭을 하면 지원하는 display 방식을 표시합니다.

Lasest Value: 최종 결과만 표시.
Value History: 결과를 리스트로 출력.
Graph: 결과를 그래프로 출력.


3. 보조파일 추가하기

  • playground 파일의 Sources 폴더에 보조코드 파일을 추가 할수 있습니다.
  • Sources 폴더의 swift 파일들은 framework 로 미리 컴파일되어 메인 playground 파일에 module 로 자동으로 import 됩니다.
  • 주의할 점으로 playground 메인파일에서 접근할 수 있도록 클래스, 메서드, 함수, 변수, 프로토콜들은 public 으로 선언되어여야합니다.



4. 리소스 추가하기

  • playground 또는 page 에 이미지, 정적데이터 파일, 사운드와 같은 리소스를 포함할수 있습니다.



5. 커스텀 프레임워크 임포트

  • UIKit 과 같은 시스템 프레임워크 외에 커스텀 프레임워크의 import도 가능합니다.
  • 커스텀 프레임워크를 import 하기 위해서는 프로젝트와 playground 파일이 동일한 워크스페이스에 존재해야합니다.
  • 프로젝트의 워크스페이스가 존재하지 않으면 워크스페이스를 생성하고, playground 파일을 워크스페이스에 포함시킵니다.
  • playground 에서 접근하기 위해서 프로젝트의 클래스, 메서드, 함수, 변수, 프로토콜들은 public 으로 선언되어여야합니다.



6. UIView 렌더링 

  • playground의 멋진 기능 중의 하나로 UIView 를 구현하고 그 렌더링 결과를 확인할 수 있습니다.
let view = UIView(frame: CGRectMake(0,0,320,320))
view.backgroundColor = UIColor.magentaColor()

let label = UILabel(frame: CGRectMake(100, 100, 100, 30))
label.textAlignment = .Center
label.text = "Welcome!"
view.addSubview(label)

code 에 렌더링 결과를 삽입하거나, quick look 으로도 확인이 가능합니다.



7. 비동기 처리

  • playground는 디폴트로 위에서 아래로 코드를 실행하며 흐름을 종료합니다.
  • 비동기 api 통신의 경우 결과를 출력하지 못하고 바로 실행을 종료하게 됩니다.
  • XCPSetExecutionShouldContinueIndefinitely(true)를 상위해서 호출하면 비동기 요청이 완료할 때까지 playground 를 종료하지 않고 대기시킬 수 있습니다.
  • XCPSetExecutionShouldContinueIndefinitely 함수를 사용하려면 XCPlayground 프레임워크를 import 해야합니다.
import XCPlayground

// 비동기 처리하기 

XCPSetExecutionShouldContinueIndefinitely(true)

var imageSearch = "https://ajax.googleapis.com/ajax/services/search/images?v=1.0&q=girl"

let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
var task = session.dataTaskWithURL(NSURL(string: imageSearch)!) {
    (data:NSData?, response:NSURLResponse?, error:NSError?) in
    if let res = response as? NSHTTPURLResponse {
        print("\(res.statusCode)", terminator:"\n")
        print("\(res.allHeaderFields)", terminator:"\n")
    }
    if let data = data {
        if let json = try? NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments) {
            print("\(json)")
        }
    }
}
task.resume()


8. 마크다운 사용하기

  • 마크다운 문법을 지원하여 rich한 playground 문서를 작성할 수 있습니다.
  • 코드의 실행결과도 삽입할 수 있기 때문에 시각적인 컨텐츠를 작성할 수 있습니다.
  • swift 주석문 // 과 /* */ 구문에 콜론을 사용하면 마크다운 문법으로 인식합니다.
  • Editor > Show Rendered Markup 메뉴를 통해 마크다운 렌더링 결과를 확인할수 있습니다.
// 1. 마크다운 사용하기

//: This line will have **bold** and *italic* text.

/*:
## Headers of All Sizes

### Lists of Links

- [NSHipster](http://nshipster.com)
- [ASCIIwwdc](http://asciiwwdc.com)
- [SwiftDoc](http://swiftdoc.org)

### Images, Too

![Remote Image](http://nshipster.s3.amazonaws.com/alert.gif)


*Images in the Resources directory can be referenced locally*
*/

렌더링 결과를 확인해 볼까요?



8. 페이지 추가하기

  • playground에 페이지를 추가하여 모듈화된 학습환경을 만들 수 있습니다.

    File > New > Playground Page 메뉴.

  • Page 마다 Sources, Resources 폴더가 생성됩니다.
  • 가장 위의 Page 부터 빠른 순서를 갖으며, 페이지간 네비게이션을 추가할 때 의미를 가지게 됩니다.


9. 페이지간 네비게이션 추가하기

  • rich comment를 사용하여 페이지 간의 네비게이션을 추가할 수 있습니다.
  • 네비게이션은 rich comment 렌더링 모드에서 페이지 링크로 표시됩니다.
  • 3가지 종류의 네비게이션, 다음 페이지, 이전 페이지, 특정 페이지로 이동이 존재하며 아래와 같이 표현합니다.
// 다음 페이지로 이동하며, 마지막 페이지에서는 무시됩니다.
//: [Go to Next Page](@next)

// 이전 페이지로 이동하며, 첫 페이지에서는 무시됩니다.
//: [Go to Previous Page](@previous)

// 특정 페이지로 이동합니다. 공백은 %20으로 표기합니다.  
//: [Go to The End](Page%20Third)  
  • Page Second 에 네비게이션을 추가하고


  • 렌디링 모드에서 다음과 같은 결과를 확인할 수 있습니다.





[swift2] Swift Guard

Swift 2015. 9. 11. 21:33

Guard 문을 이해하기 쉽게 설명하고 있는 글을 발견하여 소개합니다. 원문을 조금 의역하고 예제를 수정했습니다.

원문: Swift's Guard

Swift2.0에 추가된 guard 구문은 멋집니다. 실 세계에서 가드가 하는 것과 같은 유사한 역할을 하지요. 학교 경비는 학교에 소속된 학생들만 교문을 입장하도록 허용합니다. 소속되지 않는 학생이 들어오려고 하면, 저지하고 되돌려 보냅니다. guard 문은 뒤따르는 조건이 충족되지 않을 경우, 로직실행을 멈추고 함수를 반환합니다.

guard 문의 사용법에 대해 몇가지 알아보겠습니다.


1. 함수안에서 Guard

  • 함수 안에서 guard 문은 올바른 입력에 대해서만 함수의 실행을 허용합니다.
func guardInFunction(string: String?) {
    guard string != nil else { return }
    print(string!, "second param", separator: "  ", terminator: "\n")
}

guardInFunction("test")

guardInFunction(nil)

위 함수는 nil 입력을 가드합니다. 만일 입력이 nil이면 guard문은 else 절을 수행하고 다른 구문이 수행되기 전에 함수를 return합니다.


2. 옵셔널 바인딩(Optional Binding)

옵셔널 바인딩을 guard문과 조합하여 사용하면, 이전의 코드를 다음과 같이 재작성 할 수 있습니다.

func guardWithOptionalBinding(string: String?) {
    guard let letString = string else { return }
    print(letString, "second param", separator: "  ", terminator: "\n")
}

guardWithOptionalBinding("test")

인자 string이 nil이면 else 절을 수행하고 그렇지 않으면 함수는 정상흐름을 계속하고, string을 출력합니다. if-let 문법을 사용한 옵셔널 바인딩을 사용해봤다면 무엇인가 다르다는 것을 느낄수 있을 것입니다. 옵셔널 바인딩된 상수를 조건문 범위 바깥에서도 사용할 수 있습니다. if-let의 경우에는 if문 조건을 만족하는 경우 if 블럭 내부에서만 사용할 수 있습니다.

guard 문의 경우에 조건이 true이면, 상수의 사용범위는 함수의 나머지 영역이 됩니다. guard문 이후 어디에서라도 사용할수 있습니다.


3. 복합 옵셔널 바인딩(Compound Optional Binding)

다음 예제처럼 복합해서 옵셔널 바인딩을 사용할 수 있습니다. 모든 파라미터가 nil이 아닐경우에 조건을 충족하고 출력문을 수행할 수 있습니다.

func guardWithCompoundOptionalBinding(firstName: String?, lastName:String?, dateOfBirth:String?, country:String? ) {
    guard let fname = firstName, let lname = lastName, let dob = dateOfBirth, let cnt = country else { return }

    print("\(fname) \(lname) \(dob) \(cnt)", separator: "", terminator: "\n")
}

guardWithCompoundOptionalBinding("sungbae", lastName: "kim", dateOfBirth: "", country: "korea")


4. 제어흐름 이동(Transferring Control)

위 예제에서 주목할 만한 것은, 조건이 충족되지 않으면 함수로부터 반환되는 것입니다. 이것은 guard 문이 조건을 만족하지 않으면 제어흐름의 이동시키는 구문을 가져야 하기 때문입니다. 위 예제에서 우리는 return문을 사용했습니다. 루프의 경우에는 continue와 break를 사용할 수 있습니다. 또한 우리는 error를 throw 할 수 있습니다. 예제를 보겠습니다.

func guardTransferringControl() {
    var strings:Array<String> = ["Safe", "Coding", "why", "using", "guard", "statement"]

    for string in strings {
        guard string != "why" else {
            continue
        }
        print("string", separator: "", terminator: "\n")
    }
}

guardTransferringControl()

조건문을 만족하지 않으면, else 구문에서 제어흐름을 이동시키기 위해 continue를 사용했습니다.

이것이 guard 문이 하는 일입니다.

[java] 글 목록

언어로그/Java 2015. 9. 3. 20:31


JAVA 5


비트 자바 고급과정

  • 컬렉션(Collection)
  • Hibernate, AOP
  • MVC2, 리다이렉트, 포워드
  • SQL
  • SQL2
  • 게시판 프로그램 변화 과정
  • 네트워크, 소켓 프로그래밍
  • 다국어 지원, 댓글구현
  • 다운로드
  • 스트러츠, iBATIS
  • 아파치 프로젝트
  • 웹서버 설계와 구현
  • 이클립스 웹프로젝트 설정
  • 자바 IO
  • 자바 프로그래밍
  • 페이징
  • 프레임워크, 스트러츠, 4-layers
  • 프레임워크 spring에 통합하기
  • 프레임워크 spring에 통합하기. validation 프레임워크
  • AJAX
  • AjaxLib, DWR
  • AspectJ, Tiles, SiteMash
  • DWR로 로그인 하기
  • EL, JSTL
  • HTML1
  • HTML2
  • HTML3, Javascript
  • IBATIS, 게시판, 댓글, 첨부파일, 회원결합
  • IBATOR, 검색기능, IBATIS, Dynamic SQL
  • JDBC
  • JDBC2, SWING
  • JDBC Template
  • Junit, 단위테스트, 로그인 구현, Spring 프레임워크
  • SAX, WAS
  • Listener, Filter, AOP
  • Servlet, JSP
  • Spring과 IBATIS 연동, MultiActionController, SimpleFormController, DWR과 Spring 연동
  • Spring 프레임워크, SpringMVC
  • SpringMVC2, Spring2
  • WAS 구현
  • XML


라이프 게임(Life Game)


기타



'언어로그 > Java' 카테고리의 다른 글

[java] 글 목록  (0) 2015.09.03
[Java] 자바란?  (0) 2013.02.16
[java] 라이프 게임 (life game)  (1) 2013.02.03
[java] 제13회 한국자바개발자 컨퍼런스  (0) 2013.01.30
Inner Class(내부 클래스)  (0) 2011.04.12
컬렉션(Collection)  (0) 2011.04.11

Swift 글 목록

Swift/글 목록 2015. 9. 3. 13:55


Xcode7.3 Release Notes


Swift 소개


Swift의 기초


Playground


String


Error Handling


Protocol Oriented Programming


Performance


Functional Programming


Swift로 앱만들기



Xcode7 beta Release Notes

'Swift > 글 목록' 카테고리의 다른 글

Swift 글 목록  (0) 2015.09.03

[swift2] Swift2에서의 문자열(strings)

Swift 2015. 9. 2. 22:47

다음 포스트는 애플 공식 Swift 블로그의 Strings in Swift2 포스트를 번역했습니다.


Swift는 표준 라이브러리의 일부분으로, 성능이 뛰어나고 유니코드와 호환되는 String 구현을 제공합니다. Swift2에서, String 타입은 더이상 CollectionType 프로토콜을 구현하지 않습니다. (이전에는 String은 배열과 유사한 Character 값의 컬렉션이었습니다.) 이제 String은 character 컬렉션을 제공하는 characters 프로퍼티를 제공합니다.

무엇이 바뀌었을까요?
문자들의 컬렉션이 자연스러운 모델이지만, String 타입은 Array, Set, Ditionary와 같은 컬렉션 타입과 꽤 다르게 동작합니다. Swift2에서 프로토콜 extension이 추가되면서 몇몇 변경사항이 생겼습니다.



부분의 합과 다릅니다.

컬렉션에 엘리먼트를 추가하면, 컬렉션은 그 엘리먼트를 포함할 것이라 기대할수 있습니다. 즉 배열에 값을 추가하면, 배열은 그 값을 포함합니다. 동일한 규칙이 dictionary와 Set에도 적용됩니다. 그러나 string에 결합마크 문자를 추가하면 string 자체의 내용이 변합니다.

4개의 문자를 갖는 문자열 cafe를 예를 들어보겠습니다.

var letters: [Character] = ["c", "a", "f", "e"]
var string: String = String(letters)

print(letters.count) // 4
print(string) // cafe
print(string.characters.count) // 4

만일 악센트 문자 U+0301 ´를 결합하면, 문자열은 그대로 4글자 이지만 마지막 문자는 이제 é 입니다.

let acuteAccent: Character = "\u{0301}" // ´ COMBINING ACUTE ACCENT' (U+0301)

string.append(acuteAccent)
print(string.characters.count) // 4
print(string.characters.last!) // é 

string의 characters 속성은 오리지널 소문자 e를 포함하지도 않고, 이전에 추가됐던 악센트 문자 ´도 포함하지 않습니다. string은 이제 악센트가 붙은 소문자 "e" 즉 é를 포함합니다.

string.characters.contains("e") // false
string.characters.contains("´") // false
string.characters.contains("é") // true

만일 다른 컬렉션처럼 string을 다룬다면 결과는 Set에 UIColor.redColor() 과 UIColor.greenColor()를 추가하면 set은 UIColor.yellowColor() 포함한다고 리포트하는 것만큼 놀라울 것입니다.



문자의 내용에 따라 결정됩니다.

string과 collection의 또 다른 차이점은 동등성을 판단하는 방법입니다.

  • 두 배열은 엘리먼트의 개수가 같고, 대응하는 인덱스에 각 엘리먼트 쌍이 동일하면 동등합니다.
  • 두 집합은 엘리먼트의 개수가 같고, 첫 번째 집합에 포함된 각 엘리먼트가 두 번째 집합에도 포함되어 있을때 동등합니다.
  • 두 사전은 같은 키,값 쌍을 가지고 있을때 동일합니다.

그러나 String은 canonically equivalent 에 기초하여 동등성이 결정됩니다. 문자는 같은 언어적 의미와 외형을 가진다면 다른 유니코드 스칼라로 구성되어 있다하더라도 cannonically 동등합니다.

canonically equivalent: 유니코드 문자 인코딩 표준에 정의된 스펙. 코드포인트 순서집합이 출력되었을 때, 같은 외형과 의미를 갖을때 canonically equivalent 하다고 표현합니다.

자음과 모음을 나타내는 24개의 문자로 구성된 한국어 표기법을 예로 들어보겠습니다. 표기할때 각 문자들은 각 음절이 결합하여 글자를 이룹니다. 예를 들어 글자 '가'는 문자 'ㄱ' 과 'ㅏ' 로 구성됩니다. Swift에서는 String은 조합형인지 완성형인지에 상관없이 동등성을 판단합니다.

let decomposed = "\u{1100}\u{1161}" // ᄀ + ᅡ
let precomposed = "\u{AC00}" // 가

decomposed == precomposed // true

즉 String은 다른 Swift 컬렉션 타입의 어떤것들과도 완전 다르게 동작합니다. 🐟과 🍚 값으로 구성된 배열이 🍣과 동등하다고 여겨진다면 매우 놀라울 것입니다.



당신의 관점에 달려있습니다.

string은 collection이 아닙니다. 대신 string은 CollectionType 프로토콜을 따르는 뷰들을 제공합니다.

  • characters는 Character 값 또는 extended grapheme cluster의 컬렉션입니다.
  • unicodeScalars 는 유니코드 스칼라 값들의 컬렉션입니다.
  • utf8는 UTF-8 코드 유닛의 컬렉션입니다.
  • utf16은 UTF-16 코드 유닛의 컬렉션입니다.

extended grapheme cluster: 유니코드 스칼라 묶음이 조합되었을 때, 사람이 읽을 수 있는 문자가 되는 구성.

이전이 예제에서 단어 café 는 [ c, a, f, e ] 와 [ ´ ] 로 구성되어 있으며, string의 다양한 뷰들은 아래와 같습니다.



  • characers 속성은 사용자가 인식하는 문자인 extended grapheme clusters로 분리합니다. string은 문자열 내부에서 문자 경계를 결정하기 위해 코드 포인트라고 하는 각 위치를 순회해야 하기 때문에, 이 속성에 대한 접근은 O(n) 시간이 걸립니다. 인간이 읽을수 있는 텍스트를 포함하는 문자열을 처리할 때, localizedStandardCompare(_:) 메서드나 localizedLowercaseString 속성에서 사용되는 하이레벨 locale-sensitive 유니코드 알고리즘들에서 문자단위 처리가 자주 사용됩니다.

  • unicodeScalars 속성은 문자열에 저장된 내부의 스칼라 값을 노출합니다. 만일 원래 문자열이 조합형 e + ´ 로 구성되지 않고 완성형 é로 생성되었다면, 이런 구성이 유니코드 스칼라뷰에 반영됩니다. 문자 데이터의 low-level 조작을 수행할때 이 API를 사용하세요.

  • utf8과 utf16 속성들은 UTF-8과 UTF-16 표현에 대한 코드포인트를 제공합니다. 이 값들은 특정 인코딩으로부터 혹은 인코딩으로 변환할때 파일에 쓰여지는 실제 바이트에 대응합니다. UTF-8 코드 유닛은 많은 POSIX 문자열 처리 API에서 사용되며, UTF-16 코드 유닛은 문자열의 길이와 오프셋을 표현하기 위해 Cocoa & Cocoa Touch에서 전반적으로 사용됩니다.

[C/C++] C 언어 포스트 목록

언어로그/C/C++ 2015. 8. 30. 14:19

[swift2] Xcode7 beta6 Swift 언어 변경사항

Swift 2015. 8. 27. 01:48


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





[iOS] 익스텐션 (Extension)

아이폰 2015. 8. 18. 21:12

1. iOS 익스텐션 개요

  • 익스텐션은 애플리케이션의 특정기능을 다른 애플리케이션에서 사용될 수 있게 하기 위해 설계된 iOS8의 한 부분.
  • 익스텐션의 목적은 특정 기능을 다른 애플리케이션에서 접근할 수 있도록 하는 것.


2. 익스텐션 타입

  • iOS는 익스텐션 포인트(extension point)로 지시되는 익스텐션 타입을 제공.
  • 익스텐션 포인트는 익스텐션이 구현될 수 있도록 공개한 iOS 운영체제의 영역.


1. 투데이 익스텐션(Today Extension)

  • iOS 알림센터의 Today 화면에서 사용할 수 있는 익스텐션.
  • 디폴트로 캘린더 정보와 우세한 주식가격 정보를 표시.
  • 사용자에게 정보를 표시하는 위젯형태를 취함.



2. 쉐어 익스텐션(Share Extension)

  • 소셜 네트워크 사이트 또는 컨텐츠 공유 서비스의 호스트앱에서 이미지, 비디오, 텍스트, 웹사이트 등의 컨텐츠를 공유하기 위한 빠른 접근 매커니즘 제공.
  • 쉐어 익스텐션은 사용자가 호스트앱에서 공유버튼을 눌렀을 때 표시되는 액티비티 뷰 컨트롤러 패널에 표시됨.
  • 컨텐츠 포스팅을 위한 인터페이스 구현을 위해 SLComposeServiceViewController클래스 이용.
  • SLComposeServiceViewController는 UI 커스터마이징이 가능하며, 포스팅하기 전에 수정할수 있는 기능을 제공.



3. 액션 익스텐션(Action Extension)

  • 호스트 앱 내의 컨텐츠가 다른 식으로 변형되거나 보여지도록 만듬.
  • 쉐어 익스텐션처럼 공유버튼을 통해 액티비티 뷰 컨트롤러로 접근.
  • 호스트앱의 콘텐츠 타입을 지원하는 액션 익스텐션만 옵션으로 표시됨.



4. 포토 에디팅(Photo Editing Extension)

  • 애플리케이션의 사진 편집 기능을 내장된 iOS 사진 앱 내에서 접근할 수 있도록 해줌.
  • 사진앱에서 이미지 선택후 편집 옵션을 선택한 다음 ... 버튼을 탭할 때 표시됨.



5. 도큐먼트 익스텐션(Document Extension)

  • 다른 애플리케이션이 디바이스에서 실행되는 동안 (익스텐션을) 포함하는 앱이 문서 저장소처럼 동작하도록 함.
  • Document Picker ViewController 익스텐션과 File Provider 익스텐션으로 구성됨.
  • Document Picker ViewController 익스텐션은 문서들을 검색하거나 선택할 수 있는 사용자 인터페이스를 제공함.
  • File Provider 익스텐션은 호스트앱이 앱의 샌드박스 외부에 있는 문서에 접근할 수 있도록 해줌.
  • 포함하는 앱에서 저장된 문서를 이동하거나 여는 작업을 지원해야 한다면 파일 프로파이더 익스텐션이 필요함.



6. 커스텀 키보드 익스텐션(Custom Keyboard Extension)

  • iOS 디바이스에 커스텀 키보드를 생성하고 설치할 수 있도록 함.
  • 디바이스의 모든 애플리케이션에서 사용될수 있음.
  • 설정앱의 키보드 설정에서 선택할수 있음.