Slide 1

Slide 1 text

Swift LT @Wantedly 2014-07-17 yohei sugigami

Slide 2

Slide 2 text

ਿ্༸ฏ εΪΨϛϤ΢ϔΠ (JU)VC!TVTJFZZ ઌ݄+0*/ͨ͠͹͔Γͷ৽ถϓϩάϥϚʔ ! ! ! 8BOUFEMZͰ͸ߴ͍2JJUBྗ͕ٻΊΒΕΔ SwiftͰ̎Ґ

Slide 3

Slide 3 text

ɾSwiftͷΞϓϦ։ൃͰϋϚͬͨ ɹ͜ͱ ̍̌ݸ ! ɾXcode6ͱSwiftͷΞϓϦ։ൃͰ ɹ౿Μͩ஍ཕͨͪ̔ݸ ΞδΣϯμ

Slide 4

Slide 4 text

Xcode6Ͱ৽نͷΞϓϦΛ։ൃͨ࣌͠ʹؾ͍ͮͨ͜ͱ Λ·ͱΊ·͢ɻΞϓϦͷ࢓༷͸ҎԼͷͱ͓Γɻ ! - ։ൃݴޠ͸Swift - CocoapodsͰطଘObjcͷϥΠϒϥϦΛར༻ - σϓϩΠλʔήοτ͸iOS8Ҏ্ - StoryboardΛར༻ - AutolayoutͱSizeClassesΛར༻

Slide 5

Slide 5 text

։ൃ؀ڥ͸ҎԼͷͱ͓Γɻ ! - Xcode6͸Beta2, 3Λར༻ - ݕূ࣮ػ͸iOS8 Beta2, 3ΛΠϯετʔϧͷiPhone5 ! Beta2Ͱ։ൃ͍ͯͨ͠ΒɺBeta3͕ग़·ͨ͠ ʘ(^o^)ʗ

Slide 6

Slide 6 text

SwiftͷΞϓϦ։ൃͰ ϋϚͬͨ͜ͱ

Slide 7

Slide 7 text

ҎԼͷ༷ͳObjCϝιουʹSwiftͷ ΫϩʔδϟΛ౉͢ํ๏ @interface HogeFuga : NSObject + (void) hogeUsingBlock:(id)bock; @end

Slide 8

Slide 8 text

ObjC id = Swift AnyObject

Slide 9

Slide 9 text

HogeFuga.hogeUsingBlock( { () -> () in println("Fuga") }) ERROR Type '() -> ()' does not conform to protocol 'AnyObject'

Slide 10

Slide 10 text

var closures: AnyObject = { () in println("Fuga") } ERROR Type '() -> ()' does not conform to protocol 'AnyObject'

Slide 11

Slide 11 text

typedef void (^Block)(); ! @interface HogeFuga (Wrapper) + (void) hogeUsingBlockWrapper:(Block)block; @end ! @implementation HogeFuga (Wrapper) + (void) hogeUsingBlockWrapper:(Block)block; { [HogeFuga hogeUsingBlock:block]; } @end ObjCͰܕΛ໌ࣔͨ͠ϒϩοΫΛ ࣋ͭϝιουͰϥοϓ͢Δ

Slide 12

Slide 12 text

NSObject#descriptionΛΦʔόʔϥ Πυ͢Δ ᶄ

Slide 13

Slide 13 text

class Hoge: NSObject { var name: String? var note: String? override func description() -> String { return "Name = \(self.name), Note = \(self.note)" } } ERROR Method does not override any method from its superclass

Slide 14

Slide 14 text

class Hoge: NSObject { var name: String? var note: String? override var description: String! { get { return "Name = \(self.name), Note = \(self.note)" } } } ϓϩύςΟͷΦʔόʔϥΠυ͢Δ

Slide 15

Slide 15 text

ObjCͷenum஋ΛSwiftه๏Ͱهࡌ ͢Δํ๏͕Θ͔Βͳ͍ ᶅ

Slide 16

Slide 16 text

Swift UIViewAutoresizing.FlexibleLeftMargin typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) { UIViewAutoresizingNone = 0, UIViewAutoresizingFlexibleLeftMargin = 1 << 0, … } ObjC UIViewAutoresizingFlexibleLeftMargin Θ͔Γ΍͍͢ྫ

Slide 17

Slide 17 text

Swift UIViewAnimationOptions.LayoutSubviews typedef NS_OPTIONS(NSUInteger, UIViewAnimationOptions) { UIViewAnimationOptionLayoutSubviews = 1 << 0, UIViewAnimationOptionAllowUserInteraction = 1 << 1, … } ObjC UIViewAnimationOptionLayoutSubviews ڐ༰ൣғͳྫ

Slide 18

Slide 18 text

Swift HogeStyle.FugaValue1 typedef NS_ENUM(NSInteger, HogeStyle) { HogeFugaDefault, HogeFugaValue1, HogeFugaValue2, HogeFugaSubtitle }; ObjC HogeFugaValue1 ෳࡶͳྫʢPrefix͕Ұக͍ͯ͠ͳ͍ʣ

Slide 19

Slide 19 text

enumܕͷϝιουҾ਺΍ม਺ʹ enumͰఆٛ͞Εͨఆ਺Ҏ֎Λઃఆ ͢ΔͱΤϥʔʹͳΔ ᶆ

Slide 20

Slide 20 text

typedef NS_ENUM(NSInteger, UIViewContentMode) { UIViewContentModeScaleToFill, ... } ! self.view.contentMode = 0 ! // => ERROR Cannot convert the expression's type '()' to type 'UIViewContentMode' Swiftͷܕ͸ݫ͍͠Ͱ͢Ͷ

Slide 21

Slide 21 text

εΧϥʔܕͷΩϟετ͸ίϯόʔ δϣϯΛ࢖͏ ᶇ

Slide 22

Slide 22 text

let i: Int = Int(1.0) let n: NSInteger = NSInteger(1.0) ! let f: Float = Float(100) let d: Double = Double(100) let g: CGFloat = CGFloat(100) SwiftͰ͸εΧϥʔܕͷΩϟετ͸ͳ͍ ୅ΘΓʹίϯόʔδϣϯΛར༻

Slide 23

Slide 23 text

let index: NSInteger = 1 let width: CGFloat = 100 let r = width * (CGFloat)index ! // => ERROR Consecutive statements on a line must be separated by ';' ObjCϥΠΫͳΩϟετ͸Ͱ͖ͳ͍

Slide 24

Slide 24 text

let someObjects: [AnyObject] = [ Movie(name: "2001: A Space", director: "Stan"), Movie(name: "Moon", director: "Duncan Jones"), Movie(name: "Alien", director: "Ridley Scott") ] ! for object in someObjects { let movie = object as Movie // Type Casting ! println("Movie: '\(movie.name)', dir. \(movie.director)") } ิ଍
 ΦϒδΣΫτܕ͸ΩϟετՄೳ

Slide 25

Slide 25 text

for movie in someObjects as [Movie] { println("Movie: '\(movie.name)', dir. \(movie.director)") } ഑ྻΛΩϟετ͢ΔͱίϯύΫτʹॻ͚Δ

Slide 26

Slide 26 text

CGFloatͱFloat·ͨ͸Doubleͷԋࢉ ᶈ

Slide 27

Slide 27 text

import CoreGraphics ! typealias CGFloat = Float CoreGraphicsʹ͸CGFloat͸FloatͱΤΠϦΞ ε͞Ε͍ͯΔ

Slide 28

Slide 28 text

let index: NSInteger = 1 let width: CGFloat = 100 let r1 = width * Float(index) ! // => ERROR Could not find an overload for '*' that accepts the supplied arguments CGFloatͱFloatͷԋࢉ Ұݟਖ਼͘͠ಈ࡞ͦ͠͏͕ͩΤϥʔʹͳΔ

Slide 29

Slide 29 text

ͳͥͳΒ iPhone5s(arm64)ΛλʔήοτʹϏ ϧυ͍ͯ͠Δ͔Β

Slide 30

Slide 30 text

͜ͷͱ͖CGFloat͸SwiftͷDouble ʹΤΠϦΞε͞ΕΔ

Slide 31

Slide 31 text

let index: NSInteger = 1 let width: CGFloat = 100 let r2 = width * Double(index) // => OK iPhone5s(arm64)ͷ৔߹͸Doubleͩͱίϯ ύΠϧͰ͖Δ

Slide 32

Slide 32 text

let index: NSInteger = 1 let width: CGFloat = 100 let r = width * CGFloat(index) // => OK CGFloatͱͷԋࢉ͸CGFloatʹίϯόʔ δϣϯ͠·͠ΐ͏

Slide 33

Slide 33 text

ObjCͷNSIntegerͱSwiftͷIntͷԋ ࢉ ᶉ

Slide 34

Slide 34 text

typealias NSInteger = Int ! ! let i: Int = 1 let n: NSInteger = 1 let x: CGFloat = 3 let y: Float = 3 let w = i + Int(x) + Int(y) // => OK let q = n + Int(x) + Int(y) // => OK ! if n == i { println("HERE!") // => OK }

Slide 35

Slide 35 text

let u: NSUInteger = 1 ! // ERROR => Use of undeclared type 'NSUInteger'; did you mean to use 'Int'? NSUInteger ͸ར༻Ͱ͖·ͤΜ

Slide 36

Slide 36 text

ΫϩʔδϟܕϓϩύςΟͷΦϓ γϣφϧͳॻ͖ํ ᶊ

Slide 37

Slide 37 text

class Fuga { var completion: ( () -> () )? } ؙׅހͰׅΓ·͢

Slide 38

Slide 38 text

ObjCͷClassܕΛύϥϝʔλʹͱΔ ϝιουʹSwiftͷClassΛ౉͢ํ๏ ᶋ

Slide 39

Slide 39 text

@interface RKObjectMapping : RKMapping { +(instancetype)mappingForClass:(Class)objectClass } ! ! @implementation RKObjectMappingOp… { return [mapping.objectClass new]; } ౉ͨ͠Classܕ͕ObjCଆͰnew͞ΕΔέʔε ʢྫɿ Restkit)

Slide 40

Slide 40 text

Swift͔ΒͲ͏͍͏ clazz Λ౉ͤ͹͍͍ͷ͔ class HogeModel: NSObject { } ! ! var clazz = ???
 let mapping: RKObjectMapping = RKObjectMapping(forClass: clazz)

Slide 41

Slide 41 text

var clazz: AnyClass = NSClassFromString(“WTDHogeModel”) ! // ERROR => EXC_BAD_INSTRUNCTION ࣦഊᶃ NSClassFromStringͰ౉͢

Slide 42

Slide 42 text

var clazz: AnyClass = object_getClass(WTDHogeModel()) ! ! // newͰERROR [mapping.objectClass new]; ࣦഊᶄ object_getClassͰ౉͢

Slide 43

Slide 43 text

var clazz: NSObject.Type = WTDHogeModel.self
 let mapping: RKObjectMapping = RKObjectMapping(forClass: clazz) ! ! // ʹʼ OK ݁࿦ NSObject.TypeΛ౉͢

Slide 44

Slide 44 text

γϯάϧτϯύλʔϯΛ࣮૷͢Δ ̏ͭͷํ๏ ᶌ

Slide 45

Slide 45 text

! ! ஗ԆॳظԽʢlazy initializationʣͱεϨου ηʔϑʢthread safetyʣ͕ߟྀ͞Ε࣮ͨ૷

Slide 46

Slide 46 text

class Singleton { class var sharedInstance : Singleton { struct Static { static var onceToken : dispatch_once_t = 0 static var instance : Singleton? = nil } dispatch_once(&Static.onceToken) { Static.instance = Singleton() } return Static.instance! } } dispatch_onceͰఆٛ ObjCͱಉ༷ͷ࣮૷ํ๏
 ຖճ͜ΕΛॻ͘ʹͷ͸େม

Slide 47

Slide 47 text

let _SingletonSharedInstance = Singleton() ! class Singleton { class var sharedInstance : Singleton { return _SingletonSharedInstance } } άϩʔόϧఆ਺Ͱఆٛ ࠓޙSwiftͷݴޠ࢓༷͕มߋ͞Εہॴతά ϩʔόϧม਺͕ఆٛͰ͖ΔΑ͏ʹͳΕ͹ɺ ͜ͷ࣮૷ํ๏͕΋ͬͱ΋γϯϓϧ

Slide 48

Slide 48 text

class Singleton { class var sharedInstance : Singleton { struct Static { static let instance : Singleton = Singleton() } return Static.instance } } structͷstaticఆ਺Ͱఆٛ ʢਪ঑ʣ Swiftͷclass͸staticఆ਺Λར༻Ͱ͖ͳ͍ͷ ͰɺstructͰωετͯ͠staticఆ਺Λอ࣋

Slide 49

Slide 49 text

Xcode6ͱSwift&iOS8 ͷΞϓϦ։ൃͰ౿Μ ͩ஍ཕͨͪ

Slide 50

Slide 50 text

ίϯύΠϧΤϥʔ XXXHeaderϑΝΠϧ has been modified since the precompiled header ᶃ

Slide 51

Slide 51 text

fatal error: file ‘…/UIKit.framework/ Headers /UIVisualEffectView.h’ has been modified since the precompiled header …

Slide 52

Slide 52 text

ରԠํ๏ ຖճͳ͔ͥͳ͓ΔରԠํ๏͕·ͪ·ͪ ! - Xcode6࠶ىಈ - ϏϧυΛΫϦʔϯ͢Δ - DerivedDataΛ࡟আ͢Δ - OSXΛ࠶ىಈ͢Δ - Xcode6ΛೖΕͳ͓͢ orz

Slide 53

Slide 53 text

ᶄ IBOutletͷStoryboardͱͷίωΫ γϣϯ͋Γ͕දࣔ͞Εͳ͍৔߹͕ ͋Δ

Slide 54

Slide 54 text

ίϯύΠϧޙͷΞϓϦͷڍಈ͸ਖ਼͘͠઀ଓ ͞Ε͍ͯΔঢ়ଶͰಈ࡞͍ͯ͠·ͨ͠

Slide 55

Slide 55 text

ᶅ StoryboardͷϑΝΠϧΛ։͍ͯ΋ XMLͰදࣔ͞ΕΔ

Slide 56

Slide 56 text

XML…

Slide 57

Slide 57 text

໌ࣔతʹ։͖·͠ΐ͏

Slide 58

Slide 58 text

ᶆ ιʔείʔυϋΠϥΠτͱೖྗิ ׬͕ޮ͔ͳ͘ͳΔ

Slide 59

Slide 59 text

ͨ·ʹ෮׆΋͠·͆͢

Slide 60

Slide 60 text

ᶇ γϛϡϨʔλʔͰΞϓϦΛىಈ͠ Α͏ͱ͢ΔͱΤϥʔʹͳΔ

Slide 61

Slide 61 text

Xcode6ͱγϛϡϨʔλʔΛ࠶ىಈ ͨ͠Βͳ͓Γ·ͨ͠ɻ

Slide 62

Slide 62 text

ᶈ Xcode5ͱXcode6ͷγϛϡϨʔλʔ Ͱಉ࣌ʹΞϓϦΛىಈͰ͖ͳ͍

Slide 63

Slide 63 text

ͲͪΒ͔ͷγϛϡϨʔλʔΛऴྃ ͠·͠ΐ͏

Slide 64

Slide 64 text

ᶉ switchͱॻ͘ͱXcode͕ϑϦʔζ͢ Δ

Slide 65

Slide 65 text

Beta3Ͱ͸·ͩग़͍ͯͳ͍Ͱ͢

Slide 66

Slide 66 text

ᶊ ޡͬͯϓϩδΣΫτΛXcode5Ͱ։ ͍ͯStroyboardΛ։͘ͱXcode6Ͱ Stroyboard͕͓͔͘͠ͳ͍ͬͯΔ

Slide 67

Slide 67 text

Xcode5Ͱޡͬͯ։͍ͨΒԿ΍ΒΤϥʔ͕ ϑΝΠϧ͕ഁյ͞Ε·ͨ͠ɻ git reset ͳͲͰϑΝΠϧΛ໭͠·͠ΐ͏ɻ

Slide 68

Slide 68 text

Finder͔ΒϓϩδΣΫτϑΝΠϧΛ μϒϧΫϦοΫͯ͠։͘ͱXcode5 Ͱ։͔ΕΔ͜ͱ΋͋Γ·͢ɻ

Slide 69

Slide 69 text

Xcode5Λىಈ͢ΔͱɺXcode6Ͱ࡞ ۀ͍ͯͨ͠ϓϩδΣΫτΛউखʹ ։͘৔߹͕͋Γ·͢ɻ

Slide 70

Slide 70 text

༧๷ࡦ ! ̍. gitͳͲͰࡉ͔͘ίϛοτͯ͠ϩʔϧόοΫͰ͖Δ Α͏ʹ ! ̎. Xcode6ͰϓϩδΣΫτΛ։͍ͨΒετʔϦϘʔυ Λ࠷ऴฤूը໘ʹͯ͠ด͡ͳ͍ ! ̏. Xcode6Λऴྃ͢Δͱ͖͸ϓϩδΣΫτΛด͔ͯ͡ Βऴྃ͢Δ ! ̐. Xcode5ΛࣺͯΔ͆

Slide 71

Slide 71 text

iOS,Android Rails ΤϯδχΞ ืूத hiring@wantedly.com ڵຯ͕͋Δํ͸ͪ͜Β͔Β͝࿈བྷ͍ͩ͘͞ ৽͍ٕ͠ज़ʹͲΜͲΜ௅ઓ͍ͨ͠ ϞόΠϧΤϯδχΞɾ΢Υϯςουʂʂ ͪ͜Β͔ΒͰ΋OKͰ͢

Slide 72

Slide 72 text

͓ΘΓ