Slide 1

Slide 1 text

*EJPNTJO4XJGU Kaz Yoshikawa May 2016

Slide 2

Slide 2 text

"CPVUNF

Slide 3

Slide 3 text

,B[:PTIJLBXB w &MFDUSJDXPPET--$୅ද%JHJUBM-ZOY4ZTUFNT*OD෭୅ද w FNBJMLB[!EJHJUBMMZOYDPN w -JOLFE*OIUUQTXXXMJOLFEJODPNJOLB[ZPTIJLBXB w 8PSLJOH)JTUPSZ w "EPCF4ZTUFNT 5PLZP  w -JPOCSJEHF 5PLZP  w 2VBSL 5PLZP%FOWFS  w )VNNJOHCJSE$PNNVOJDBUJPOT .U7JFX 64"  w 'BDU*OUFSOBUJPOBM 7BODPVWFS $BOBEB  w 1FSMF4ZTUFNT 5PSPOUP $BOBEB FUD

Slide 4

Slide 4 text

&OHJOFFSJOH

Slide 5

Slide 5 text

কع൫,JU

Slide 6

Slide 6 text

8IBUJT*EJPN

Slide 7

Slide 7 text

0QUJPOBM

Slide 8

Slide 8 text

HVBSEMFU w ೋͭͷҾ਺͕OJMͰͳ͍ࣄΛอূ͢Δ func add(a: Int?, _ b: Int?) -> Int? { guard let a = a, let b = b else { return nil } return a + b }

Slide 9

Slide 9 text

JGMFU w JGMFUΛ࢖͏ func add(a: Int?, _ b: Int?) -> Int? { if let a = a, let b = b { return a + b } return nil }

Slide 10

Slide 10 text

XIFSF w HVBSEMFUͰ̌Ҏ্Λอূ͢Δ func add(a: Int?, _ b: Int?) -> Int? { guard let a = a, let b = b where a >= 0 && b >= 0 else { return nil } return a + b } w JGMFUͰ΋̌Ҏ্Λอূ͢Δ func add(a: Int?, _ b: Int?) -> Int? { if let a = a, let b = b where a >= 0 && b >= 0 { return a + b } return nil }

Slide 11

Slide 11 text

OJMDPBMFTDJOH0QFSBUPS w OJMͷ৔߹͸ͱͯ͠ѻ͏ func add(a: Int?, b: Int?) -> Int { return (a ?? 0) + (b ?? 0) }

Slide 12

Slide 12 text

4XJUDI

Slide 13

Slide 13 text

0QUJPOBMJO4XJUDI w ࣮͸PQUJPOBM΋TXJUDIจʹ࢖͑Δ func countryName(identifier: String?) -> String? { switch identifier { case "JP"?: return "Japan" case "GB"?: return "England" case "US"?: return "U.S.A." default: return nil } }

Slide 14

Slide 14 text

-BUF*OJUJBMJ[JOH
 *NNVUBCMF7BSJBCMFT w ॳظ஋ΛޙͰઃఆ͢Δෆఆม਺ let color: UIColor // "= value" switch value % 3 { case 0: color = UIColor.whiteColor() case 1: color = UIColor.redColor() default: fatalError() } w ॳظԽ͠ͳ͍έʔε͕͋ΔͱɺίϯύΠϧΤϥʔ

Slide 15

Slide 15 text

$PNQMFYTXJUDIDBTFT for thing in things { switch thing { case 0 as Int: print("zero as an Int") case 0 as Double: print("zero as a Double") case let someInt as Int: print("an integer value of \(someInt)") case let someDouble as Double where someDouble > 0: print("a positive double value of \(someDouble)") case is Double: print("some other double value") case let someString as String: print("a string value of \"\(someString)\"") case let (x, y) as (Double, Double): print("an (x, y) point at \(x), \(y)") case let movie as Movie: print("Movie:'\(movie.name)'") default: print("something else") } }

Slide 16

Slide 16 text

*NQMJDJUMZ 6OXSBQQFE0QUJPOBM

Slide 17

Slide 17 text

*NQMJDJUMZ6OXSBQQFE 0QUJPOBMXJUIJGTUBUFNFOU w *NQMJDJUMZ6OXSBQQFE0QUJPOBMͰ΋JGMFU͸࢖͑Δ let a: Int!
 
 if let a = a { print("\(a)") }

Slide 18

Slide 18 text

*NQMJDJUMZ6OXSBQQFE0QUJPOBM XJUIHVBSETUBUFNFOU w *NQMJDJUMZ6OXSBQQFE0QUJPOBMͰ΋HVBSE͸࢖͑Δ class MyObject { var value: Int! = nil func some() { guard let value = value else { return } print("\(value)") } func other() { guard value != nil else { return } print("\(value)") } }

Slide 19

Slide 19 text

"TTPDJBUFE7BMVFT

Slide 20

Slide 20 text

%FpOJOH"TTPDJBUFE 7BMVF enum Element { case String(Swift.String) case Boolean(Bool) case Integer(Int) case Float(Swift.Float) case Dictionary([Swift.String: Element]) case Array([Element]) case Null } let integer = Element.Integer(42) let city = Element.String("Tokyo") let cities = Element.Array([city]) let dictionary = Element.Dictionary(["items": array])

Slide 21

Slide 21 text

&YUSBDUJOH"TTPDJBUFE7BMVFT 6TJOHTXJUDI4UBUFNFOU w "TTPDJBUFE7BMVFΛ4XJUDIจͰऔΓग़͢ switch element { case .String(let string): print("string: \(string)") case .Boolean(let value): print("boolean: \(value)") case .Integer(let value): print("ineteger: \(value)") case .Float(let value): print("float: \(value)") case .Dictionary(let dictionary): print("dictionary: \(dictionary)") case .Array(let array): print("array: \(array)") case .Null: print("null") }

Slide 22

Slide 22 text

&YUSBDUJOH"TTPDJBUFE 7BMVFTVTJOHJG4UBUFNFOU w *GจͰ΋औΓग़ͤ·͢ let element1: Element = … if case .String(let string) = element1 { print("\(string)") } w 0QUJPOBMͳ৔߹Ͱ΋औΓग़ͤ·͢ let element: Element? = … if case .String(let string)? = element1 { print("\(string)") }

Slide 23

Slide 23 text

&YUSBDUJOH"TTPDJBUFE 7BMVFT w EJWJTJPONFNCFSTQFSTPOOBNF let name = Element.String("John") let john = Element.Dictionary(["name": name]) let members = Element.Array([john]) let group = Element.Dictionary(["members": members]) w ҰൃͰऔΓग़ͤΔ if case .Dictionary(let group) = group, case .Array(let members)? = division["members"], case .Dictionary(let member)? = members.first, case .String(let name)? = member["name"] { print("\(name)") // John }

Slide 24

Slide 24 text

$MPTVSF

Slide 25

Slide 25 text

#BTJD$MPTVSF class MyViewController: UIViewController { var state: Bool = false func toggle(animated: Bool) { let closure = { self.view.backgroundColor = self.state ? UIColor.redColor() : UIColor.whiteColor() self.state = !self.state } if animated { UIView.animateWithDuration(0.3) { closure() // <-- Here!! } } else { closure() // <-- Here!! } } }

Slide 26

Slide 26 text

#BTJD$MPTVSF class MyViewController: UIViewController { var state: Bool = false func toggle(animated: Bool) { let closure = { self.view.backgroundColor = self.state ? UIColor.redColor() : UIColor.whiteColor() self.state = !self.state } if animated { UIView.animateWithDuration(0.3) { closure() // <-- Here!! } } else { closure() // <-- Here!! } } }

Slide 27

Slide 27 text

&YFDVUFPO.BJO5ISFBE func dispatch_sync_main(block: () -> Void) { if NSThread.isMainThread() { block() } else { dispatch_sync(dispatch_get_main_queue()) { () -> Void in block() } } } dispatch_sync_main { self.tableView.reloadData() }

Slide 28

Slide 28 text

&YFDVUFPO.BJO5ISFBE func dispatch_sync_main(block: () -> Void) { if NSThread.isMainThread() { block() } else { dispatch_sync(dispatch_get_main_queue()) { () -> Void in block() } } } dispatch_sync_main { self.tableView.reloadData() }

Slide 29

Slide 29 text

&YFDVUFPO.BJO5ISFBE func dispatch_sync_main(block: () -> Void) { if NSThread.isMainThread() { block() } else { dispatch_sync(dispatch_get_main_queue()) { () -> Void in block() } } } dispatch_sync_main { self.tableView.reloadData() }

Slide 30

Slide 30 text

*OJUJBMJ[F*NNVUBCMF 7BSJBCMF6TJOH$MPTVSF w DMPTVSFͱTXJUDIจΛ࢖͏ͱ͔ͬ͜Α͘ॻ͚Δ 
 let color: UIColor = { switch value % 2 { case 0: return UIColor.whiteColor() case 1: return UIColor.redColor() default: fatalError() } }() // "()" !!

Slide 31

Slide 31 text

*OJUJBMJ[F*NNVUBCMF 7BSJBCMF6TJOH$MPTVSF w DMPTVSFͱTXJUDIจΛ࢖͏ͱ͔ͬ͜Α͘ॻ͚Δ 
 let color: UIColor = { switch value % 2 { case 0: return UIColor.whiteColor() case 1: return UIColor.redColor() default: fatalError() } }() // "()" !!

Slide 32

Slide 32 text

$IBOHJOH#FIBWJPSXJUI 6TJOH$MPTVSF typealias DrawingHandler = (UIPanGestureRecognizer)->() class MyView: UIView { func panGesture(sender: UIPanGestureRecognizer) { self.drawingHandler(sender) } var drawingHandler: DrawingHandler! let ovalGesture: DrawingHandler = { gesture in // draw oval } let rectangleGesture: DrawingHandler = { gesture in // draw rectangle } }

Slide 33

Slide 33 text

$IBOHJOH#FIBWJPSXJUI 6TJOH$MPTVSF typealias DrawingHandler = (UIPanGestureRecognizer)->() class MyView: UIView { func panGesture(sender: UIPanGestureRecognizer) { self.drawingHandler(sender) } var drawingHandler: DrawingHandler! let ovalGesture: DrawingHandler = { gesture in // draw oval } let rectangleGesture: DrawingHandler = { gesture in // draw rectangle } }

Slide 34

Slide 34 text

MB[Z

Slide 35

Slide 35 text

8IFOTIPVME*VTFMB[Z w ॲཧ͕ॏͯ͘ॳظԽ࣌ʹ࣮ߦ͢Δͷ͸ෆ౎߹ w େਓͷཧ༝ͰJOJUͰॳظԽͰ͖ͳ͍ϓϩύςΟ

Slide 36

Slide 36 text

6TJOHMB[ZWBS class MyObject { lazy var path: String = { return NSBundle.mainBundle() .pathForResource("text", ofType: "txt")! }() lazy var text: String = { return try! String(contentsOfFile: self.path) }() }

Slide 37

Slide 37 text

*OJUJBMJ[JOHDPEFQFS JOTUBODF w Կճݺ͹Εͯ΋ΠϯελϯεຖʹҰ౓ͷΈॳظԽ͢Δίʔυ class MyView: UIView { override func layoutSubviews() { print("MyView: \(#function)") super.layoutSubviews() setup() } private lazy var setup: (()->()) = { print("MyView: \(#function)") // ͞·͟·ͳॳظԽͷίʔυ return {} }() } IUUQRJJUBDPNDPEFMZOYJUFNTGEGF

Slide 38

Slide 38 text

4JOHMFUPO

Slide 39

Slide 39 text

4JOHMFUPO w యܕతͳγϯάϧτϯ 
 class Manager { static let sharedManager = Manager() private init() { } } w ΫϩʔδϟʔΛ࢖ͬͨγϯάϧτϯ class Manager { static var sharedManager: Manager = { return Manager() }() private init() { } } http://qiita.com/codelynx/items/a936afe0a45d4cf5abfb

Slide 40

Slide 40 text

6QEBUJOH$TUZMF
 AGPSATUBUFNFOU http://qiita.com/codelynx/items/899c26dd2cbdba7d2b00

Slide 41

Slide 41 text

GPSWBSJJJ // C-Style for statement for var i = 0 ; i < 100 ; i++ { print("\(i)") } // Swift 3.0 ready (0 ..< 100).forEach { print("\($0)") } // Swift 3.0 ready for i in (0 ..< 100) { print("\(i)") }

Slide 42

Slide 42 text

GPSWBSJJJ // C-Style for statement for var i = 99 ; i >= 0 ; i-- { print("\(i)") } // Swift 3.0 ready (0 ..< 100).reverse().forEach { print("\($0)") } // Swift 3.0 ready for i in (0 ..< 100).reverse() { print("\(i)") }

Slide 43

Slide 43 text

GPSWBSJJJ  // C-Style for statement for var i = 0; i < 100 ; i += 2 { print("\(i)") } // Swift 3.0 ready 0.stride(to: 100, by: 2).forEach { print("\($0)") }

Slide 44

Slide 44 text

GPSWBSJJJ  // C-Style for statement for var i = 98 ; i >= 0 ; i -= 2 { print("\(i)") } // Swift 3.0 ready 98.stride(through: 0, by: -2).forEach { print("\($0)") } // Swift 3.0 ready 0.stride(to: 100, by: 2).reverse().forEach { print("\($0)") } // Swift 3.0 ready for i in 0.stride(to: 100, by: 2).reverse() { print("\(i)") }

Slide 45

Slide 45 text

GPSXJUIPVUJODSFNFOU w ࣍ͷ࠶ॳظԽࣜͷࢦఆ͕ͳ͘ɺࠁΈ͕ෆఆͷ৔߹ // C-Style for statement for var i = 0 ; i < 100 ; { print("\(i)") if (i * i) % 2 == 0 { i += 1 } else { i += 2 } } // Swift 3.0 ready var i = 0 while i < 100 { print("\(i)") if (i * i) % 2 == 0 { i += 1 } else { i += 2 } }

Slide 46

Slide 46 text

$PNQVUFE1SPQFSUJFT BOE1SPQFSUZ0CTFSWFS

Slide 47

Slide 47 text

$VTUPN1SPQFSUZ class MyObject { private var _name: String = "" var name: String { get { return _name } set { _name = newValue } } }

Slide 48

Slide 48 text

1SPQFSUZ0CTFSWFS class MyView: UIView { var name: String = "" { didSet { self.setNeedsLayout() } } }

Slide 49

Slide 49 text

8SBQ6Q

Slide 50

Slide 50 text

8SBQVQ w ஌͍ͬͯͯ΋ɺඵͰࢥ͍ग़ͤͳ͍ه๏͸͍Ζ͍Ζ͋ Δ w 0QFO4PVSDFΛࢄࡦͯ͠ઌਓୡͷه๏Λࢀߟʹ w ؾ͕͍ͭͨه๏͕͋Ε͹ɺQMBZHSPVOEͳͲʹϝϞ w ࣌ʑɺTXJGUจ๏ॻΛோΊ௚ͯ͠ΈΑ͏

Slide 51

Slide 51 text

5IBOL:PV Kaz Yoshikawa [email protected]