[Osxdev]4.swift

1,700 views

Published on

OSXDEV 오픈세미나 - WWDC 따라잡기

Published in: Technology
0 Comments
20 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,700
On SlideShare
0
From Embeds
0
Number of Embeds
14
Actions
Shares
0
Downloads
41
Comments
0
Likes
20
Embeds 0
No embeds

No notes for slide

[Osxdev]4.swift

  1. 1. 안녕하세요 SWIFT WWDC 2014 OSXDEV 김영후 짤방이 제거된 버전
  2. 2. 출처 • WWDC 2014 키노트 • WWDC 2014 402, 403, 404, 407 • The Swift Programming Language • Using Swift with Cocoa and Objective-C • https://medium.com/swift-programming/
  3. 3. –가로수길 M사 W대표님 “이제 다시 같은 출발선에 섰다 ㅋㅋㅋ”
  4. 4. 스위프트에 대한 소개 누구를 대상으로 할 것인가?
  5. 5. 기존의 iOS 개발자들 Objective-C 마스터
  6. 6. iOS 경험은 있지만 마성의 [[[ObjectiveC 가] 싫어서] 중단];
  7. 7. 스위프트 떡밥을 문 타 언어 고수
  8. 8. 비 개발자 “스위프트 좀 쉽다는데?”
  9. 9. 기존의 iOS 개발자들 + 다른 언어에 경험이 있는 개발자
  10. 10. ㅠㅠ 죄송
  11. 11. 스위프트의 주요 기능에 대한 전반적인 개요
  12. 12. 양이 너무 많음
  13. 13. 그래서 여러분이 스위프트를 공부한다면
  14. 14. 여기쯤에서? 클래스까진 봐야지
  15. 15. 그래서 골라봤습니다
  16. 16. 목차 • 소개 • Optional • Memory Management • Initialization • String • Closures • Pattern Matching • Generics and Protocols
  17. 17. 목차 • 소개 • Optional! • Memory Management! • Initialization! • String! • Closures • Pattern Matching • Generics and Protocols
  18. 18. 꼼꼼하게 책으로 공부하실때 생각 나실 수 있도록
  19. 19. SWIFT 소개
  20. 20. Chris Lattner • 2000년 일리노이 석사시절 LLVM • 2005년 애플 합류 • 2010년에 Swift 개발을 시작 • 2011년에 개발자들이 합류, 2013년에 애플 개발 툴의 주요 포커스가 됨 • “Objective-C, Rust, Haskell, Ruby, Python, C#, CLU, and far too many others to list.” (Chris Lattner)
  21. 21. [크리스 래트너 김정님]
  22. 22. SWIFT • LLVM 기반 • SWIFT는 SWIFT다 • 함수형 • Safety (Safe, Modern, Powerful)
  23. 23. LLVM & SWIFT
  24. 24. “더 이상의 자세한 설명은 생략한다”
  25. 25. SWIFT는 SWIFT
  26. 26. Objective-C • C언어의 프리프로세서 + 런타임 확장 = 슈퍼셋 • 모든 코드에 존재론적 의문을 가질 수 있음 • 클래스는 C에서 어떻게 표현되는가? • 메세징은 C에서 어떻게 수행되는가? • 대신 엄청난 메타프로그래밍이 가능 • class_replaceMethod, • class_getClassMethod • imp_implementationWithBlock
  27. 27. Objective-C 런타임에 NSValueTransformer의 서브클래스 생성 NSValueTransformer+TransformerKit.m
  28. 28. SWIFT • Objective-C와 상호운용성이 뛰어나지만 의존하진 않음 • Enum은 스위프트 Enum • Class는 스위프트 Class • Struct는 스위프트 Struct • String은 스위프트 String
  29. 29. Safety Safe, Modern, Powerful
  30. 30. Optional • var optionalNumber: Int? • 값이 있을수도 / 없을수도 있는 상황을 표현 • optionalNumber = 6 • optionalNumber = nil
  31. 31. Non-Optional • var myString:String = “aString” • myString = nil 
 //컴파일 에러
  32. 32. 한편 Objective-C에선…
  33. 33. 부재를 표현하는 것들 • nil • Nil • NULL • [NSNull null] • -1 • 0 • NSNotFound = NSIntegerMax • INT_MAX • nullable (C#): int? i
  34. 34. NSString *f
  35. 35. pointer to NSString or nil
  36. 36. char *
  37. 37. pointer to char or NULL
  38. 38. nil/NULL의 존재는 정적 타입 시스템이 커버하지 못하는 약점 C = Static but not Strong
  39. 39. [nil isEqual: nil] 참이어야 하지만 nil에다 메세징을 하면 값은 0
  40. 40. NSUInteger index = [array indexOfObject: obj]
 [array removeObjectAtIndex: index] 
 //index가 NSNotFound라면 Runtime Error //SWIFT
 func indexOfObject(obj: T) -> Int? array.removeObjectAtIndex(array.indexOfObject(obj)) 
 //Compile error
  41. 41. Optional Return Types • let age:Int? = mySomeString.toInt() • Type Inference • let age = mySomeString.toInt()

  42. 42. Unwrapping Optional • let age = mySomeString.toInt() • println(age); //컴파일 에러 • println(age!);
  43. 43. Optional Binding • println(“My age is, (age!)”); 
 //age가 nil이면 에러 • var age:Int? = mySomeString.toInt()
 if let ageValue = age {
 println(“나는 (ageValue)살 입니다”)
 } else {
 println(“나는 태어나지 않았습니다”)
 }
  44. 44. Optional Binding • if let age = mySomeString.toInt() {
 println(“나는 (age)살 입니다”)
 } else {
 println(“나는 태어나지 않았습니다”)
 }
  45. 45. Optional Chaining
  46. 46. Optional Chaining
  47. 47. Optional Chaining
  48. 48. 여기서 안전하게 buildingNumber를 가져오려면? Residence가 nil인가? Address가 nil인가? buildingNumber가 nil인가?
  49. 49. Optional Chaining
  50. 50. Optional Chaining
  51. 51. Optionals • 없을 수도 있는 값에 대한 안전한 표현형 • 없으면 nil • 값을 꺼내기 위해 ! 오퍼레이터를 사용해야 하지만 • if let을 사용하자 • Optional Chaining은 복잡한 구조와의 작업을 간결하게
  52. 52. Memory Management • Automatic Reference Counting • Reference cycle • weak and unowned
  53. 53. Reference cycle
  54. 54. weak • Optional • 레퍼하는 객체가 deallocated되면 그 값이 nil이 됨 • Objective-C에서 애용
  55. 55. weak
  56. 56. unowned • weak처럼 레퍼 객체를 strong hold하지 않음 • nil이 되는 weak과 달리 값이 항상 있다고 가정함 • unowned를 쓰는 객체는 unowned 객체가 해제될 때 같이 날라감
  57. 57. unowned
  58. 58. 상하관계가 있는 레퍼런스 사이클 을 만들때 unowned가 우리가 보통 생각하는 것
  59. 59. weak, unowned • weak 독립적인 라이프사이클을 가지는 객체들에 사용 • unowned 같은 라이프사이클을 가지는 객체들에 사용
  60. 60. Initialization 모든 값은 사용되기 전에 초기화 되어야 한다
  61. 61. Initialization • var message: String • if sessionStarted {
 message = “스위프트 세미나에 오신걸 환영합니다”
 } • println(message) 
 //컴파일 에러
  62. 62. Initialization • var message: String • if sessionStarted {
 message = “스위프트 세미나에 오신걸 환영합니다”
 } else {
 message = “”
 } • println(message)
  63. 63. Initializers • Initailizer는 모든 프로퍼티를 초기화 해야한다 • struct Color {
 let red, green, blue: Double
 init(grayScale: Double) {
 green = grayScale
 blue = grayScale
 }
 } //컴파일 에러: red 값이 초기화 되지 않음
  64. 64. Initializers • struct Color {
 let red, green, blue: Double
 init(grayScale: Double) {
 red = grayScale
 green = grayScale
 blue = grayScale
 }
 }
  65. 65. Initializers • struct Color {
 let red, green, colour: Double
 mutating func validateColor() { … }
 init(grayScale: Double) {
 red = grayScale
 green = grayScale
 validateColor()
 blue = grayScale
 }
 } //error
  66. 66. Initializers • struct Color {
 let red, green, colour: Double
 mutating func validateColor() { … }
 init(grayScale: Double) {
 red = grayScale
 green = grayScale
 blue = grayscale
 validateColor()
 }
 }
  67. 67. Memberwise Initializers • struct Color {
 let red, green, blue: Double
 } • let magenta = Color(red: 1.0, green: 0.0, blue: 1.0)
  68. 68. Default Values • struct Color {
 let red = 0.0, green = 0.0, blue = 0.0
 }
  69. 69. 클래스 • class Home {
 var phone:Phone?
 var mac:Mac
 
 init() {
 
 }
 } //컴파일 에러
  70. 70. 클래스 • class Home {
 var phone:Phone?
 var mac:Mac
 
 init() {
 mac = Mac()
 }
 }
  71. 71. 클래스 • class Home {
 var phone:Phone?
 var mac:Mac?
 }
  72. 72. 클래스 상속
  73. 73. 슈퍼 콜이 뒤에 와야함
  74. 74. Designated • 모든 프로퍼티를 초기화 시키는 생성자
  75. 75. Convenience • 최종적으로 Designated Initializer를 호출하는 짧은 생성자 • 다른 Convenience를 호출하여 Designated로 가도 됨
  76. 76. 생성자는 어떻게 상속되나
  77. 77. 모든 프로퍼티를 초기화하라지만 그 값이 비쌀 경우
  78. 78. @lazy를 씁니다
  79. 79. deinit 객체 라이프사이클이 종료될 때 호출 됨 ARC 때문에 별로 쓸일은 없지만 리소스/옵저버 해제용
  80. 80. Initailization 정리 • 모든 값은 사용전에 초기화 되어야 한다 • super.init 전에 모든 프로퍼티 값이 초기화 되어야 한다 • Designated는 상위 생성자만을 호출한다 • Convenience는 상위 생성자를 호출하지 않는다
  81. 81. 이 모든걸
  82. 82. 컴파일 타임에!
  83. 83. 이제 Optional과 Init을 알았으니 정리 겸 설명안하고 넘어간 Optional 기능
  84. 84. Implicitly Unwrapped Optionals 또 다른 느낌표
  85. 85. 흔히 Objective-C에서 작성하던 코드 viewDidLoad에서 UITableView를 초기화 컴파일이 될까요?
  86. 86. 안됨 initializers가 필요한 이유는? 
 TimelineViewController가 생성될 때 tableView가 초기화 되지 않음
  87. 87. 하지만 난 viewDidLoad에서 UITableView를 초기화 하고 싶은데? self.view.bounds/frame을 쓸 수 있잖아
  88. 88. 이렇게 된 이상 Optional로 간다
  89. 89. 매번 느낌표를 써야함 tableView!.delegate = self
  90. 90. Implicitly Unwrapped Optionals 를 이래서 씁니다
  91. 91. UITableView! 와 같이 선언하면 Optional이지만 개발자와의 
 으리로 생성후엔 !를 안써도 컴파일러가 믿어줌
  92. 92. 보통 Optional과 완전 동일 런타임 크래시도 동일 !로 언래핑 명시를 안하는건 개발자와의 으리
  93. 93. Non-Optional과 구별이 안되잖아요? 타입 선언부를 보지 않고선 그렇습니다
  94. 94. 불완전한 세상 Objective-C로 만들어진 프레임워크를 이용할 때는 너무 옵셔널이 많으므 로 너무 많은 Unwrapping!을 피하기 위해 고육지책으로 넣지 않았나 싶음
  95. 95. 아직 판단 유보 하지만 애플은 대부분의 UI 프로퍼티에 잘 씁니다 UITableViewController도 UITableView!로 선언 ! 애플의 Interoperability 가이드에도 전부 사용
  96. 96. 원점으로 돌아가서 이 UIViewController에서 이 UITableView가 nil일 가능성이 있는가? 없는데 Optional을 써야하는가?
  97. 97. 물론 init에서 초기화를 하면 Optional을 안쓸 수 있습니다
  98. 98. 더 안전한 세상 var 대신 let Optional 대신 Non-Optional
  99. 99. Implicitly Unwrapped Optionals 이 방향성에 약간 물음을 가지게 되는 기능 하지만 이해는 한다…
  100. 100. String and NSString
  101. 101. String • NSString이 아니다 • 단 스위프트가 자동으로 NSString과 브릿지를 만듬 • NSString이 필요 한곳에 String을 넣으면 알아서 처리됨 • NSString을 명시적으로 쓸 일은 거의 없다고…
  102. 102. String - NSString • 스위프트가 Objective-C API를 임포트하면 • 모든 NSString타입을 String타입으로 암묵적으로 변환 • vice versa
  103. 103. Mutability • NSString의 대응이 아니라는 확실한 예
  104. 104. NSString 메소드 • commaSeparatedNames는 String • componentsSeparatedByString은 NSString의 메소드 • 자동적으로 String -> NSString -> String 변환
  105. 105. 두 메소드만 • length와 characterAtIndex는 String에서 불가능 • Character 타입이 추가되었고 String은 Character의 컬렉션으로 바뀌었기 때문 • countElement(mySwiftString) //글로벌 메소드 • 유니코드 문제
  106. 106. NSString • NSString을 명시적으로 선언하면 • 두 메소드를 사용가능
  107. 107. NSString
  108. 108. NSString + NSString
  109. 109. String + NSString
  110. 110. Closure
  111. 111. 리턴 없애기
  112. 112. 인자 없애기
  113. 113. 괄호를 없애자
  114. 114. Trailing Closures • dispatch_async(queue, ^{
 …
 }); • dispatch_async(queue) {
 …
 }

  115. 115. 다른 언어에서 많이 보던거
  116. 116. __block은 없어
  117. 117. Closure Are ARC Objects 이것이 문제
  118. 118. Objective-C에선
  119. 119. • __weak MyObject *weakSelf = self;
 [self setMyBlock:^(id obj) {
 __typeof__(self) strongSelf = weakSelf;
 if (strongSelf) {
 //일 좀 하자…
 }
 }];
  120. 120. weak은 스위프트에서 유효함 하지만 unowned가 출동하면 어떨까
  121. 121. 다 TempNotifier가 해제될 때 블록도 해제 됨
  122. 122. 무조건 예뻐야 함
  123. 123. 패턴매칭 패턴?
  124. 124. 패턴매칭 Switch, Tuple, Enum, Guard
  125. 125. enum과 함께
  126. 126. 연관된 값을 가지는 enum, Delayed
  127. 127. enum의 값을 바인딩해서 사용 가능
  128. 128. 일반 스위치문 조건이 A면 X코드를 실행, B면 Y코드를 실행, C면 Z코드를 실행 단순한 조건 체크에 따른 분기
  129. 129. 패턴매칭 패턴매칭은 X,Y,Z에서 X와 Y가 어떤 패턴이면 Y와 Z값을 쓰겠다
  130. 130. 튜플, 바인딩, _
  131. 131. 조건문도 가능 (Guard)
  132. 132. 딕셔너리 값을 검증하는 함수
  133. 133. 딕셔너리 값을 검증하는 함수 abbr은 꼭 2글자여야 함
  134. 134. Declarative programming
  135. 135. 한편 함수형 힙스터들에게 패턴매칭은 사랑입니다
  136. 136. Assignment가 없음 = 는 패턴 매칭일 뿐 Erlang
  137. 137. 함수 호출에 패턴 매칭을 적용하여 함수를 분리해서 구현 가능 Erlang
  138. 138. SWIFT도 충분히 좋음
  139. 139. FizzBuzz • “Why Can't Programmers.. Program?” - CodingHorror • 1부터 100까지 출력하되 3의 배수는 fizz, 5의 배수는 buzz, 3과 5의 공배수면 fizzbuzz
  140. 140. • func fizzbuzz(i: Int) -> String {
 switch (i % 3, i %5) {
 case (0, _):
 return “Fizz”
 case (_, 0):
 return “Buzz”
 case (0, 0):
 return “FizzBuzz”
 default:
 return “(i)”
 }
 }
 
 for number in 1..100 {
 println(fizzbuzz(number))
 }
  141. 141. Scala
  142. 142. 고통받는 Python
  143. 143. 파이썬 좋습니다 (List Comprehension)
  144. 144. Protocols and Generic
  145. 145. 프로토콜
  146. 146. 프로토콜 확인 • if let pullableObject = object as Pullable { • as는 타입 캐스팅 • as Thing (클래스) 와 as Pullable (프로토콜)의 문법이 동일
  147. 147. Special Protocol
  148. 148. class MyObject : FloatLiteralConvertible let myObject:MyObject = 2.0
  149. 149. 언어 확장에 큰 역할을 함 XXXLiteralConvertible DSL을 구현 SWIFT-JSON https://medium.com/swift-programming/swift-and-json-reborn-b6f4f232e35e
  150. 150. Generic
  151. 151. 하지만 제네릭이 출동하면 어떨까 제! 네! 릭!
  152. 152. Generic한 스택을 만들어봅시다
  153. 153. 이 Stack으로 for를 돌고 싶다면?
  154. 154. 컴파일 에러!
  155. 155. for in의 비밀
  156. 156. 파이썬의 이터레이터 프로토콜
  157. 157. Generator Protocol
  158. 158. Advanced Swift = Protocol Hacking
  159. 159. 정리 • Optional과 Initalization을 이해하자 • unowned 짱 • 스위프트 타입(String)은 오브젝티브씨 타입(NSString)이 아니다 • 더 안전한 코드를 쓰려고 하자 • 프로토콜이나 패턴매칭등의 멋진 기능들은 당장 몰라도 좋지만 할 수 있는 길이 열렸다
  160. 160. Safety Safe, Modern, Powerful
  161. 161. 감사합니다

×