검색결과 리스트
스위프트에 해당되는 글 15건
- 2015.08.06 [swift1.2] Swift 프로토콜 지향 프로그래밍
- 2015.06.24 [swift2] Xcode7 beta2 Swift 언어 변경사항
- 2015.06.23 [swift] 문자열 Indexing과 Slicing
- 2014.10.29 [swift] Swift 기초 - 2
- 2014.10.29 [swift] Swift 기초 - 1 (1)
글
[swift1.2] Swift 프로토콜 지향 프로그래밍
WWDC 2015 세션중 "Protocol-Oriented Programming in Swift" 라는 흥미로운 세션이 있습니다. 애플에서 Standard Library 그룹의 리더를 맡고 있는 Dave Abrahams 라는 분이 발표한 세션입니다. 세션에서 제공하는 슬라이드와 InfoQ에서 이 세션을 정리한 아티클을 바탕으로 내용을 요약했습니다.
클래스는 멋집니다!
다음과 같은 멋진 특징들을 제공하지요.
- 캡슐화 (Encapsulation)
- 접근제어 (Access Cotrol)
- 추상화 (Abstraction)
- 네임스페이스 (Namespace)
- 풍부한 문법 (Epressive Syntax)
- 확장성 (Extensibility)
그런데...
구조체로도 다 할수 있습니다.
클래스는 훌륭합니다.타입은 훌륭합니다!
사실 위 특징들은 모든 타입들의 특징이며 클래스는 그것을 구현하는 하나의 방법에 불과합니다. 그렇다면 클래스 사용으로 인한 단점은 무엇이 있을까요?
1. 암묵적인 참조(Reference) 공유
- 두 객체가 동시에 어떤 객체를 참조하는 경우, 서로 그 사실을 모른채 그 객체를 변경할 수 있습니다.
- 참조 공유를 방지하기 위해 참조하는 객체를 복사할 수 있지만, 그렇게 하면 효율성이 나빠집니다.
- 참조를 공유하는 객체에 Race Conditions 이 발생할 수도 있습니다.
- Lock을 사용하여 레이스 컨디션을 방지할수 있지만 효율성은 더 나빠집니다.
- Lock을 잘못 사용하면 Deadlock 상태에 빠질 수 있습니다.
- 잦은 Lock 사용은 코드를 복잡하게 합니다.
- 복잡성은 더 많은 버그를 유발합니다.
Values Don't Share. (That's a good thing)
2. 상속 (비지니스에 관한 모든 것을 가지고 있습니다.)
- 슈퍼 클래스를 하나 밖에 가질수 없기 때문에, 초기에 잘 선택해야합니다.
- 슈퍼 클래스를 나중에 변경하는 것은 매우 어렵습니다.
- 슈퍼클래스가 갖는 모든 저장속성은 서브클래스에도 (강제적으로) 상속됩니다.
- 초기화 처리가 복잡해집니다.
- 수퍼클래스의 불변성을 깨뜨리지 않을수 없게됩니다.
- 언제 무엇을, 어떻게 재정의해야 하는지 (수퍼 클래스에 대해서)알아야 합니다.
More and more, we promote delegation.
3. 타입관계를 잃어버립니다.(Lost Type Relationships.)
- 추상 수퍼클래스와 서브클래스의 구현코드가 함께 존재하게 됩니다.
서브클래스 메소드에 접근하기 위해 수퍼클래스를 서브클래스로 다운캐스팅하면서 타입관계를 잃게됩니다.
이진탐색 클래스 모델 Ordered 정의
class Ordered {
func precedes(other: Ordered) -> Bool { fatalError("메소드를 구현해주세요.") }
}
class Number:Ordered {
var value:Double = 0
override func precedes(other: Ordered) -> Bool {
return value < (other as! Number).value //
}
}
func binarySearch(sortedKeys: [Ordered], forkey k: Ordered) -> Int {
var lo = 0
var hi = sortedKeys.count
while hi > lo {
let mid = lo + (hi - lo) / 2
if sortedKeys[mid].precedes(k) { lo = mid + 1 }
else { hi = mid }
}
return lo
}
as! ASubclass 는 타입 관계를 잃어버렸다는 신호
대부분 추상화를 위해 클래스를 사용하기 때문이다.
4. 좋은 추상화 메커니즘이란?
- Value type을 지원합니다.(클래스 외에도)
- 정적 타입관계를 지원합니다. (동적 디스패치 외에도)
- 큰 덩어리로 뭉치지 않아야합니다.
- Retroactive 모델링을 지원합니다.
- 모델에 인스턴스 데이터를 강요하지 않아야 합니다.
- 모델에 초기화의 부담이 없어야 합니다.
- 무엇을 구현해야 하는지 명확해야 합니다.
Swift는 프로토콜 지향 프로그래밍 언어!
5. 프로토콜 지향 프로그래밍
- Swift에서 새롭게 추상화를 생각할 때 첫 번째 포인트는 프로토콜!
이진탐색 프로토콜 모델 Ordered 변경해보겠습니다.
protocol Ordered {
func precedes(other:Self) -> Bool
}
struct Number : Ordered {
var value:Double = 0
func precedes(other:Number) -> Bool {
return self.value < other.value
}
}
이진탐색 함수를 정의합니다.
func binarySearch<T:Ordered>(sortedKeys:[T], forKey k: T) -> Int {
var lo = 0
var hi = sortedKeys.count
while hi > lo {
let mid = lo + (hi-lo)/2
if sortedKeys[mid].precedes(k) { lo = mid + 1 }
else { hi = mid }
}
return lo
}
Int 배열에 이진탐색 함수를 적용해 보겠습니다.
- 먼저 Int가 프로토콜 Ordered를 구현해야합니다.
// Int형 Ordered 프로토콜 구현하기
extension Int:Ordered {
func precedes(other: Int) -> Bool {
return self < other
}
}
- Int 배열에 이진탐색을 적용합니다.
// 1. 키 정렬
var keys = [10, 30, 1, 4, 5, 6, 7, 8, 55, 20]
var sortedKeys = keys.sorted { $0 < $1 }
// sortedKeys: [1, 4, 5, 6, 7, 8, 10, 20, 30, 55]
// 2. 찾을 키
var searchKey = 30
// 키 30의 index는 8.
// 3. 이진탐색
var searchIndex = binarySearch(sortedKeys, forkey: searchKey)
// searchIndex: 8
Number 배열에도 이진탐색을 적용해보겠습니다.
// 1. 정렬된 Number 배열 생성
var numbers = sortedKeys.map { return Number(value: Double($0)) }
// numbers: [1.0, 4.0, 5.0, 6.0, 7.0, 8.0, 10.0, 20.0, 30.0, 55.0]
// 2. 찾을 키
var keyToSearch = 5.0
// 3. 이진탐색
var index = binarySearch(numbers, forkey: Number(value: keyToSearch))
// index: 2
프로토콜을 사용하면, 커스텀 Number 구조체 뿐만 아니라 기존 타입에도 이진탐색을 쉽게 적용할 수 있음을 알 수 있습니다.
'Swift' 카테고리의 다른 글
| [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 언어 변경사항 (0) | 2015.07.30 |
| [swift] 성능향상 시키기 - 다이나믹 디스패치를 최소화 (0) | 2015.07.16 |
설정
트랙백
댓글
글
[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 |
설정
트랙백
댓글
글
[swift] 문자열 Indexing과 Slicing
Indexing and Slicing Strings
Swift string의 Indexing과 Slicing 대해서 알아보겠습니다.
string은 화면에 보여지는 문자들의 순서집합이라고 생각하는 것이 일반적입니다.
하지만 하나의 문자로 보일지라도 메모리 상에서는 다중 혹은 가변길이의 유니코드값으로 표현되는 경우도 있습니다.
유니코드 문자열
예를 들어 hat emoji (🎩)는 문자 a와 같은 문자보다 인코딩에 더 많은 비트가 필요로합니다.
Swift의 String 타입은 이러한 세부사항들을 처리해줍니다. string을 이루는 각 문자는 (메모리에서 차지하는 길이와는 상관없이)
사용자가 인식하는 유니코드 문자를 표현합니다. 이런 추상화 때문에 정수를 사용해서 string의 인덱스를 표현하는 것이 적합하지
않을수 있습니다.
대신 표준라이브러리는 string에서의 위치를 표현하기에 적합한 String.Index를 제공합니다.
문자열 카운팅
다음 문자열은 가변길이의 유니코드 문자들로 구성되어 있습니다.
var str = "Héllo, 🇺🇸laygr😮und!"
// str의 유니코드 문자의 개수: 18
str.characters.count // swift2.0
count(str) // swift1.2
// str의 UTF-16코드 포인트의 개수: 22
str.utf16.count // swift2.0
count(str.utf16) // swift1.2
깃발 (🇺🇸) 문자는 사실 2개의 유니코드 스칼라값이 결합되어 구성되지만 Swift는 1개의 문자로 카운팅합니다.
이런 특성이 폼 유효성 검사, 커서 포지셔닝, 텍스트 wrapping 구현을 더 쉽게합니다.
문자열 카운팅, 인덱싱, 슬라이싱은 모두 메모리가 아닌 사용자가 인식하는 문자 인덱스를 기반으로 하고있습니다.
문자열 slicing
string을 index하고 slice하는데 사용하는 Range 값을 생성해보겠습니다.
let badRange = 4..<12 // Range<Int>를 생성합니다.
str[badRange] // error: 'subscript' is unavailable: cannot subscript String with range of Int
위 코드는 정수형을 string의 인덱스로 사용할수 없다는 컴파일 에러를 발생시킵니다.
대신 다음과 같이 String.Index 객체를 사용할 수 있습니다.
let range = advance(str.startIndex, 4)..<advance(str.startIndex, 12)
string은 startIndex 와 endIndex 속성을 갖습니다.
string의 successor(), predecessor() 함수(swift2.0에서 지원)는 인덱스를 증가 또는 감소시킵니다.
advance() 함수를 사용하여 파라미터의 값만큼 offset를 이동할수 있으며, advance()함수는 인자로 전달받은 offset 만큼 successor(),predecessor()를 호출합니다.
String.Index 타입은 유니코드를 인식할수 있어서 advance()함수가 항상 string index를 적절하게 이동시킬 수 있습니다.
advance() 함수는 인자로 받은 index 타입과 동일한 타입의 값을 반환하기 때문에 ..< range 연산자는 그 타입에 해당하는 range를
생성할수 있습니다.
advance() 함수를 사용하여 string의 특정 index의 문자를 조회해보겠습니다.
str[advance(str.startIndex, 7)] // 🇺🇸를 반환한다.
str[range.startIndex] // o를 반환한다.
str[range.endIndex] // 😮를 반환한다.
str[range] // o, 🇺🇸laygr를 반환한다.
advance() 함수
또 다른 버전의 advance()함수를 사용해서 메시지를 10자로 제한하는 기능을 구현해보겠습니다.
let messageCharacterLimit = 10
let range = advance(str.startIndex, messageCharacterLimit , str.endIndex)..<advance(str.endIndex, 0)
let result = str.substringWithRange(range)
if result.isEmpty {
print("empty result")
}
// "ygr😮und!"를 출력합니다.
advance()함수는 startIndex, offset 외에 세번째 파라미터로 endIndex를 전달하면 offset이 endIndex를 초과하는 경우
end.Index를 반환해줍니다. 세번째 인자는 일종의 상한값으로 동작합니다.
'Swift' 카테고리의 다른 글
| [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 |
| [swift] Apple Swift Blog (0) | 2015.06.10 |
설정
트랙백
댓글
글
[swift] Swift 기초 - 2
Swift 두 번째 스터디입니다.
지난 시간에 학습한 내용을 정리해볼까요?
1. 변수 선언은 var 키워드를, 상수 선언은 let 키워드를 사용합니다.
2. Swift 컴파일러는 변수에 할당되는 값을 통해 타입을 추론합니다.
3. 유니코드에서 지원하는 다양한 문자를 변수 이름에 사용할 수 있습니다.
4. 문자열 타입 String, 문자 타입 Character를 지원합니다.
5. Array, Dictionary 컬렉션의 요소들은 동일한 타입이어야 합니다.
4. foreach 구문을 사용할 수 있고, for-range 루프 문을 지원합니다.
5. Switch-Case 문에 정수형 이외의 타입도 사용 가능합니다.
6. Swift의 모든 변수는 디폴트로 nil이 할당 될 수 없습니다.
7. nil 이 될수 있는 변수는 ? 연산자를 붙혀 optional 타입으로 선언합니다.
8. optional 변수는 사용하기 전에 !연산자를 사용하여 unwrapping 해야 합니다.
이번 시간에는 함수, 클로져, 그리고 enum 타입에 대해 알아보겠습니다.
optional 에 대해 다시한번 정리하고 갈까요?
optional 타입은 런타임에 발생할 수 있는 nil 에러를
컴파일 타임에 발견할 수 있도록 해줍니다.
보다 안전한 프로그램을 개발할 수 있도록 Swift 언어에서 제공하는 키워드이지요.
회사이름을 인자로 받아 주식코드를 반환하는 Objective-C 코드 예제입니다.
Facebook 에 대한 주식코드는 정의되지 않았기 때문에 마지막 라인의 코드에서
text 문자열에 nil을 추가하려고 하여 런타임 에러가 발생하는 코드입니다.
문법적으로는 유효한 구문이기 때문에
이 에러는 실제 프로그램이 실행되기 전까지 문제를 알 수 없습니다. 헉!
Swift에서는 optional 타입을 도입하여 이 문제를 멋지게 해결합니다.
nil이 될수 있는 변수는 optional 타입으로 선언하도록 강제한 것이지요.
"optional 타입"은 " nil이 될수 있으니 주의깊게 다루세요" 라고 말하는 것과 같습니다.
위 Swift 코드에서는 컴파일러가 컴파일 타임에 에러를 알려 줍니다. 굿!
optional 타입을 사용하기 전에는 반드시 옵셔널 타입을 상쇄해야 하는데, unwrapping 한다고 표현합니다.
unwrapping 하는 방법은 if 문을 사용하여 nil 이 경우에, ! 연산자를 사용하여 optional을 상쇄합니다.
if 문을 사용하는 이유는, nil 인 경우에 !연산자를 사용하면 런타임 에러가 발생하기 때문입니다.
nil이 아니라는 것을 보장하는 경우에 unwrapping해서 사용하라는 의미이지요.
이 구문은 swift에서 관용구 처럼 사용되는데, optional binding이라하는 좀더 세련된 방법을 제공합니다.
정확히 이전 구문예제와 동일한 역할을 하는 optional binding 구문입니다.
! 연산자 대신에 let 상수 키워드를 사용하여 unwrapping하는 것이 유일한 차이입니다.
자주 사용하게 될 구문이니 꼭 기억하세요.
함수 자체를 if 평가문에 사용하여 unwrapping 할수도 있습니다.
Swift에서는 func 키워드를 사용하여 함수를 정의합니다.
함수의 파라미터에 디폴트 값을 지정 할 수 있습니다.
buildGreeting()과 같이 인자없이 호출할 경우 name 파라미터에 "World" 문자열이 할당되어 사용됩니다.
튜플 타입을 지원합니다. 튜플은 쉽게 말하면 값의 묶음이라 할수 있습니다.
튜플은 선언과 동시에 상수가 되며, 값을 변경하려고 할 경우 컴파일 에러가 발생합니다.
튜플을 사용하면 한 번에 여러값을 전달하고, 반환할 수 있어서 편리합니다.
반환된 튜플을 어떻게 사용해야 할까요? 튜플 변수에 값을 할당하여 사용할 수 있습니다.
반환되는 튜플의 원소에 이름을 부여하여 사용할 수도 있습니다.
클로져는 쉽게 말해 실행가능한 코드블럭이라 할수 있습니다.
함수도 코드 블럭이기 때문에 클로져로 사용할 수 있습니다.
이 클로져를 변수에 할당해 두고 필요한 때에 호출해서 사용할 수 있습니다.
클로져는 파라미터와 반환하는 값, 그리고 코드 블럭으로 구성됩니다.
greetingPrinter는 파라미터와 반환값 없이, "Hello World!" 를 출력하는 클로져 입니다.
클로져의 재미있는 점은 함수의 인자 혹은 반환값으로 사용할 수 있다는 점입니다.
파라미터,반환값으로 정적인 데이터 뿐만이 아니라 동적인 행동(코드블럭)을
전달하여, 다양한 조합으로 사용할 수 있습니다.
위 코드는 코드블럭을 특정 횟수만큼 반복하는 클로져의 예입니다.
클로져가 마지막 파라미터 인 경우
위와 같이 함수의 꼬리에 클로져가 따라오는 형태로 사용할 수 있는데,
이런 형태를 Trailing 클로져라고 합니다.
Swift의 enum은 연관된 값을 전달하여 사용할 수 있습니다.
switch-case 문과 조합하여 유용하게 사용할 수 있는데, 자세한 설명은 나중으로 미루겠습니다.
Int 타입으로 정의한 Planet enum 변수를 println() 함수로 출력하면
엉뚱하게도 Enum Value 라는 값이 출력됩니다. enum이 갖는 값이 아닌 enum 자체가 출력되는 것입니다.
enum 의 원소값을 출력하고 싶을 때는, enum.toRaw() 멤버함수를 사용합니다.
enum 타입을 정수가 아닌 문자형으로 정의하여 원소값을 출력하는 예입니다.
나중에 클래스와 구조체에 대해 알아보겠지만
enum 도 초기화함수(생성자)와 멤버함수를 갖을 수 있습니다.
enum 을 생성하고 멤버함수를 호출하는 예입니다.
'Swift' 카테고리의 다른 글
| [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 |
| [swift] Swift 기초 - 1 (1) | 2014.10.29 |
설정
트랙백
댓글
글
[swift] Swift 기초 - 1
"Swift는 어떤 언어인가? 애플은 왜 Swift 언어를 만들었을까? "
"Objective-C 언어를 대체할 새로운 언어인가? Objective-C 언어는 사라지는건가?"
"그렇게 되기까지 어느 정도의 시간이 걸릴 것인가?"
위 질문들에 답을 찾기 위해 시작한 스터디(총 4강)의 결과물을 공유합니다.
Swift는 iOS, OSX 개발을 위해 애플에서 발표한
멀티 패러타임, 컴파일 프로그래밍 언어입니다.
2014 WWDC에서 처음 소개되었고, 코코아/코코아 터치,
Objective-C 코드와 호환되게 설계되었습니다.
2014 WWDC에서 크레이그 페더릭은 "Objective-C가 없는 C언어"라고 소개하였습니다.
C언어처럼 빠르면서 Objective-C 언어의 생산성과 강력함을 가진 언어!
애플 개발자 Swift 공식 사이트에서는 코드작성이 인터렉티브하고,
재미있고, 혁명적인 새로운 프로그래밍 언어라고 소개합니다.
Swift 단어의 뜻을 아시나요?
제비를 닮은 심볼은 해안과 산지의 바위절벽에 서식하며
여름에 우리나라에 찾아온다는 "칼새"를 의미합니다.
"신속한","빠른" 이라는 뜻도 동시에 가지고 있지요
Swift의 심볼이 정말 칼새와 똑같이 생겼네요.
Swift는 현대 프로그래밍 언어의 장점을 두루 채용한 언어입니다.
주요 스펙은 기존의 서버사이드 병렬 스크립트 swift 언어에서 가져와,
다른 특징들을 결합했다고 합니다.
Swift를 3단어로 표현하면 - SAFE! MORDERN! POWER!
2010년 애플 개발툴 부서 총책임자 "크리스 레트너"에 의해
Swift 프로젝트가 시작되었습니다. 이후 많은 개발자들의 참여로 발전하게 되었고,
오늘에 이르게 되었습니다. Swift의 아버지 = 크리스 레트너?
새롭게 소개된 Xcode6에는 Swift 코드를 인터랙티브하게 실험해볼 수 있는
Playground 라는 템플릿을 포함하고 있습니다.
컨솔출력뿐만 아니라 UI 요소들 또한 바로 확인할 수 있으며
루프문의 값을 기억해 그래프로 그려주기까지 합니다.
코드를 맘껏 가지고 놀 수 있는 놀이터 그 자체입니다.
이제부터 Swift의 문법에 대해서 알아보겠습니다.
가장 기초가 되는 변수와 상수는 어떻게 선언할까요?
변수는 var, 상수는 let 키워드를 사용합니다.
정수,실수,문자열,배열,사전,클래스 등 모든 타입들에 적용되는
일관되면서 심플한 규칙을 따릅니다.
(편리성을 위해 3문자 키워드로 맞추는 섬세함까지!)
Swift의 두드러진 특징 중의 하나로 타입추론을 꼽을 수 있습니다.
타입추론이란 할당되는 값(Value)을 통해 변수의 타입을 예측하는 것을 의미합니다.
똑똑한 컴파일러는 변수에 타입을 명시하지 않아도 할당되는 값을 보고
이 변수가 "Int 혹은 String" 타입으로 예측하고 이후부터 해당타입으로 변수를 취급합니다.
Swift는 유니코드문자를 변수이름으로 사용할 수 있습니다.
이모티콘으로도 변수이름을 지을 수 있으니 재미있을 따름입니다.
"" 쌍타옴표로 감싼 문자열을 String 타입으로 인식합니다.
Objective-C와는 다르게 문자열을 표기하는데 @를 사용하지 않지요.
for-each 구문을 사용해서 문자열(String)을
이루는 문자(Character)를 간편하게 순회할수 있습니다.
스터디를 진행했던 Xcode6 Beta 베타 버전에서는
문자+문자, 문자열+문자 의 접합연산이 가능했는데,
Swift1.0 정식버전에서는 불가능해졌습니다.
배열과 배열, 문자열과 문자열의 접합연산만이 가능다는 점! 주의하세요
포맷팅 문자열은 어떻게 만들까요?
문자열 내부에 \(변수) 구문을 사용해서 원하는 값으로 치환이 가능합니다.
앞서 언급했던 Swift의 간결함 중 한 가지! 기억하나요?
var 키워드를 사용하면 수정 가능한 문자열.
let 키워드를 사용하면 수정 불가능한 문장열을 정의할 수 있습니다.
Array와 Dictionary에 대해서 알아볼까요?
Objective-C의 NSArray, NSDictionary와 대응하는 클래스로, 대괄호[]를 사용하여 선언합니다.
Array는 값의 순서리스트를,
Dictionary는 키:값 쌍으로 초기화 할 수 있습니다.
Objective-C에서는 NSObject를 상속하는 어떤클래스도 포함할 수 있었습니다.
반면 Swift에서는 Array는 동일한 타입의 값들만 포함할 수 있고,
Dictionary는 문자열 키에 동일한 타입의 값들만 포함해야한다는 제약이 추가되었습니다.
일반적인 while과 for 루프문을 사용할 수 있습니다.
루프 조건문에서는 ()를 사용할 수 있지만 일반적으로 사용하지 않는게 관례입니다.
Objective-C에서는 볼수 없었던 Range 루프문입니다.
1...5는 1부터 5를 포함하여 5번의 루프를,
0..<5는 0부터 5를 포함하지 않고 5번의 루프를 반복합니다.
(마치 for 조건문에 i < 5와 i <= 5 를 사용하는 것처럼)
for-each 구문으로 Array를 순회할 수 있습니다.
Dictionary도 아직 배우지 않았지만 튜플을 사용하여 (키,값)쌍으로 순회할 수 있습니다.
Swift의 변수는 디폴트로 nil이 될수 없습니다.
즉 선언과 동시에 반드시 초기화가 이루어져야 하지요.
null 과 같이 아직 값을 갖지 않는 변수가 필요할 때는 어떻할까요?
그래서 필요한 것이 Optional 타입입니다. 변수의 타입 뒤에 ?를 붙여 옵셔널 타입으로
선언하면, 변수는 nil (null)값을 가질 수 있습니다.
"optional 타입" 의 자세한 내용은 다음 강의에서 설명하겠습니다.
Optional로 선언된 변수는 그냥 사용할 수 없습니다.
컴파일 에러에서 벗어나기 위해 optional 타입을 벗겨야(unwrapping) 하는데요
위와 같은 구문을 사용해서 optional 타입을 unwrapping 할 수 있습니다.
"possibleLegCount가 nil 아니면 그 값을 상수 letCount에 할당하고 if 문으로.."
처럼 해석할 수 있습니다. 역시 자세한 설명은 다음 강의에서.
switch 구문입니다. Objective-C와 다른 점을 눈치 채셨나요?
그렇습니다. case 조건안에 ,를 구분으로 여러 값을 명시할 수 있습니다.
또 switch 문에 정수형 외에 다른 타입들도 사용이 가능합니다.
1강 끝~~ 이라고 하기엔 아직 이릅니다. 아래를 보세요.
2014 WWDC 가 진행되면서 앱스토어에
WWDC 세션을 소개하고 안내하는 Swift 최초의 공식앱이 올라왔습니다.
iOS8과 요세미티를 deployment target으로 한 앱은 미래에도 정상작동을 보장합니다.
사실 메버릭스와 iOS7을 타겟으로 해도 동작하는데 그 이유는
앱 번들 안에 경량의 swift 런타임을 포함하기 때문이라고 합니다.
Swift 스펙이 안정화될 즈음에 런타임이 제거될거라 합니다.
바이너리 호환성은 보장되지 않는다고 하니, 앱의 모든 컴포넌트들은
동일한 버전의 Xcode와 Swift 컴파일러를 사용해서 빌드되야 합니다.
Swift의 스펙은 아직도 핫하게 변경되고 있어서 소스코드 수준의 호환성을
보장하지 않습니다. Xcode에서 마이그레이션 할 수 있는 수단을 제공할 계획이라고 합니다.
호환성 문제가 있긴 하지만, Swift가 기존 플랫폼에서도 실행가능한 이유는
Objective-C와 동일한 런타임을 사용하기 때문이라고 하네요
단일 프로그램에서 함께 복합해서 사용할 수도 있구요
브리징 헤더를 제공하면 Objective-C로 작성된 코드를 Swift에서도 손쉽게 사용할 수 있습니다.
Optional 타입은 왜 필요한가? 에 대한 의문이 생깁니다.
컴파일 타입에 확정된 값을 갖지 않는 변수에 사용한다면,
대다수의 변수들이 optional로 선언되어야 할텐데, 왜 굳이 옵셔널 타입이 필요한 걸까요??
자세한 내용은 다음 강의에서!
위 구문은 어떤 결과를 갖을까요?
첫번째 구문은 nil 값을 갖는 상수입니다.
상수이기 떼문에 당연히 값을 변경하고자 하면 에러가 발생하겠지요
아래 구문은 옵셔널 타입이 아니기 때문에 nil을 할당할 수 없습니다.
'Swift' 카테고리의 다른 글
| [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 |
| [swift] Swift 기초 - 1 (1) | 2014.10.29 |
설정
트랙백
댓글
-
파운데이션 2015.01.26 20:14
정말 좋은 글입니다 감사합니다