검색결과 리스트
2015/09에 해당되는 글 4건
- 2015.09.11 [swift2] Swift Guard
- 2015.09.03 [java] 글 목록
- 2015.09.03 Swift 글 목록
- 2015.09.02 [swift2] Swift2에서의 문자열(strings)
글
[swift2] Swift Guard
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 문이 하는 일입니다.
'Swift' 카테고리의 다른 글
| [swift2] 타입변환 연산자 (is, as, as?, as!) (0) | 2015.10.18 |
|---|---|
| [swift] Swift 코딩환경 Playground (0) | 2015.10.05 |
| [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 |
설정
트랙백
댓글
글
[java] 글 목록
JAVA 5
- [Java] 자바란?
- [자바] (1) 자바소개
- 다형성
- 동시성
- 문자열
- 스윙의 기초
- 열거형
- 인터페이스
- 컨테이너
- 클래스 재사용, 상속과 위임
- 프로그램 실행제어
- Assertion
- Exception
- Files
- Graphics
- Inner Class(내부 클래스)
- package
- JCJP6.0
- Serialization
- 리플렉션으로 Getter 와 Setter 검사하기
- (1) 리플렉션(Reflection)
- (2) 리플렉션(Reflection) 사용하기
- 예외처리 (Exception Handling)
- [Java] 어노테이션 사용하기
- [Java] 어노테이션(Annotation)
비트 자바 고급과정
- 컬렉션(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 글 목록
Xcode7.3 Release Notes
Swift 소개
Swift의 기초
- [swift] Swift 기초 - 1
- [swift] Swift 기초 - 2
- [swift] Swift 기초 - 3
- [swift] Swift 기초 - 4
- [swift2] 타입변환 연산자 (is, as, as?, as!)
- [swift2] 키워드로 보는 Swift
- [swift2.1] Array와 Dictionary 기초
Playground
String
- [swift] 문자열과 문자 -1 (Strings and Characters)
- [swift] 문자열 Indexing과 Slicing
- [swift2] Swift2에서의 문자열(strings)
Error Handling
Protocol Oriented Programming
- [swift1.2] Swift 프로토콜 지향 프로그래밍 1
- [swift2.1] Swift 프로토콜 지향 프로그래밍 2
- [swift2] 타입의 텍스트적인 표현 커스터마이징하기
- [swift] Map, Filter, Reduce
Performance
Functional Programming
Swift로 앱만들기
Xcode7 beta Release Notes
- [swift2] Xcode7 beta6 Swift 언어 변경사항
- [swift2] Xcode7 beta5 Swift 언어 변경사항
- [swift2] Xcode7 beta4 Swift 언어 변경사항
- [swift2] Xcode7 beta3 Swift 언어 변경사항
- [swift2] Xcode7 beta2 Swift 언어 변경사항
'Swift > 글 목록' 카테고리의 다른 글
| Swift 글 목록 (0) | 2015.09.03 |
|---|
설정
트랙백
댓글
글
[swift2] Swift2에서의 문자열(strings)
다음 포스트는 애플 공식 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에서 전반적으로 사용됩니다.
'Swift' 카테고리의 다른 글
| [swift] Swift 코딩환경 Playground (0) | 2015.10.05 |
|---|---|
| [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 |