Slide 1

Slide 1 text

Swift தڃฤ Nishiyama Yusei (@yuseinishiyama) Swift LT at Yahoo! JAPAN 2014/6/25

Slide 2

Slide 2 text

ࣗݾ঺հ • iOSΞϓϦέʔγϣϯ։ൃऀ • Unity΋গʑ • ࠷ۙ͸OpenCVɺػցֶशͷษڧΛ͍ͯ͠Δ͕਺ֶ͕ΞϨͳͷͰΞϨ • WWDC2014ؔ࿈͸ɺMetalΛ͸͡Ίͱͨ͠GPUपΓΛ௥͍͖͍ͬͯͨ name:Nishiyama Yusei twitter:@yuseinishiyamaɹ github:yuseinishiyama blog:http://yuseinishiyama.com

Slide 3

Slide 3 text

Ϡό͍ Swift৘ใग़ਚͯ͘͠Δײ͕͋Δ ˞·ͱΊ͍͖ͯͨͩ͋Γ͕ͱ͏͍͟͝·͢ɻ
 େมॏๅ͓ͯ͠Γ·͢ɻ

Slide 4

Slide 4 text

ͱΓ͋͑ͣυΩϡϝϯτ
 શ෦ಡΜͰχονͳ৘ใ୳ͦ͏… l4XJGU1SPHSBNNJOH-BOHVBHFz l6TJOH4XJGU8JUI$PDPBBOE0CKFDUJWF$z

Slide 5

Slide 5 text

ಡΜͰؾ͍ͮͨ

Slide 6

Slide 6 text

ࢲ͸Objective-C͕େ޷͖Ͱ͢

Slide 7

Slide 7 text

Objective-CΛ
 Ѫ͢ΔਓͷͨΊͷSwift ୈҰ෦

Slide 8

Slide 8 text

᷿ͷ੠ • Objective-C͸௵͕͠ޮ͔ͳ͍ɻ • Objective-CͷγϯλοΫε͸ฅɻ • SwiftͰObjective-C͔Βղ์͞Εͨɻ • []←͜Ε͕ੜཧతʹແཧɻ • ((()(())))←͜Ε͸େ޷͖͚ͩͲͶʂ

Slide 9

Slide 9 text

Ұํɺࢲ͸…

Slide 10

Slide 10 text

ফ͑ͳ͍Objective-C΁ͷѪ ⾢PCKD@NTH4FOEͷ༐࢟ͱ
 $16ͷ׻ت ࠨਤ ϝοηʔδૹ৴ ಈతଋറ /&9545&1 ๛෋ͳ࣮ߦ࣌৘ใ *.1

Slide 11

Slide 11 text

Swiftʹ
 Objective-Cͷ໘ӨΛ୳͢ຖ೔…

Slide 12

Slide 12 text

௒ઈ͍ͱ͓͍͠idܕ typedef struct objc_object { class isa; } *id; ! // ͔Θ͍͍...

Slide 13

Slide 13 text

ʮUsing Swift with Cocoa and Objective-Cʯ ΑΓ “Swift imports id as AnyObject.”

Slide 14

Slide 14 text

͍ͨʂʂ

Slide 15

Slide 15 text

࢖ͬͯΈΔ // ద౰ͳؔ਺Λએݴͯ͠... func someFunc() { return } ! // idܕ૬౰ͷΦϒδΣΫτΛએݴͯ͠... var anyObj : AnyObject ! // ίϯύΠϧ͸௨Δ͸ͣ... anyObj.someFunc()

Slide 16

Slide 16 text

'AnyObject' does not have a member named 'someFunc()'
 
 ίϯύΠϧͰ͖ͳ͍…

Slide 17

Slide 17 text

͜Μͳͷidܕ͡Όͳ͍ʂʂ

Slide 18

Slide 18 text

υΩϡϝϯτͷαϯϓϧίʔυ var myObject: AnyObject myObject = NSDate() myObject.characterAtIndex(5) // crash, myObject does't respond to that method” ! // υΩϡϝϯτͰ͸࣮ߦ࣌ΤϥʔʹͳΔͱॻ͍ͯ͋Δɻ

Slide 19

Slide 19 text

΋͏গ͠ௐ΂ͯΈΔ • You can also call any Objective-C method and access any property without casting to a more specific class type. This includes Objective-C compatible methods marked with the @objc attribute. • @objcଐੑ͕͍ͭͨɺObjective-Cޓ׵ͷϝ ιουͰͳ͍ͱ͍͚ͳ͍Β͍͠ɻ

Slide 20

Slide 20 text

͞Βʹ… • When you define a Swift class that inherits from NSObject or any other Objective-C class, the class is automatically compatible with Objective-C. • Ͳ͏΍ΒObjective-CͷΫϥεΛܧঝͨ͠SwiftͷΫ ϥε͸ࣗಈతʹObjective-Cޓ׵ʹͳΔΒ͍͠ɻ • ͖ͬ͞ͷྫͰݺͼग़͍ͯͨ͠characterAtIndex͸ Objective-Cͷϝιου͔ͩΒಈతʹݺͼग़ͤͨɻ

Slide 21

Slide 21 text

ؾΛऔΓ௚ͯ͠ // Objective-Cޓ׵ͷΫϥεɻ @objc class SomeClass { func someFunc() { return } } ! // AnyObjectʹIntܕͷ஋Λ୅ೖɻ var anyObj : AnyObject = 1 ! // ࣮૷͞Ε͍ͯͳ͍ϝιουͷݺͼग़͠... anyObj.someFunc()

Slide 22

Slide 22 text

-[__NSCFNumber someFunc]: unrecognized selector sent to instance 0x137

Slide 23

Slide 23 text

unrecognized selector

Slide 24

Slide 24 text

͜ͷ੠͸…

Slide 25

Slide 25 text

idܕͩʂʂʂʂ

Slide 26

Slide 26 text

Selector΋୳͢ let mySEL: Selector = “someFunc" ! // ஫ҙ: Playground্ͩͱΫϥογϡ͢Δɻ ! // ※ίϚϯυϥΠϯ͔ΒͷREPLͩͱେৎ෉ɻ

Slide 27

Slide 27 text

ิ଍:
 จࣈྻޓ׵ʹ͢Δϓϩτίϧ // Selector͸ҎԼͷϓϩτίϧʹదԠ͍ͯ͠ΔͷͰɺ // จࣈྻ͔ΒॳظԽͰ͖Δɻ protocol StringLiteralConvertible : ExtendedGraphemeClusterLiteralConvertible { typealias StringLiteralType class func convertFromStringLiteral(value: StringLiteralType) -> Self } ! protocol ExtendedGraphemeClusterLiteralConvertible { typealias ExtendedGraphemeClusterLiteralType class func convertFromExtendedGraphemeClusterLiteral(value: ExtendedGraphemeClusterLiteralType) -> Self }

Slide 28

Slide 28 text

Target-Actionύλʔϯ͸݈ࡏ class UIResponder : NSObject { . . . func canPerformAction(action: Selector, withSender sender: AnyObject!) -> Bool // Allows an action to be forwarded to another target. By default checks - canPerformAction:withSender: to either return self, or go up the responder chain. func targetForAction(action: Selector, withSender sender: AnyObject!) -> AnyObject! . . . }

Slide 29

Slide 29 text

݁࿦ • SwiftͰ΋ಈతͳίʔυ͕͔͚Δɻ • ͱ͸͍͏΋ͷͷɺ݁ہͷͱ͜ΖObjective-CΛ ͔·͍ͯ͠Δ͚ͩɻ • Objective-Cͱͷ࿈ܞΛߟ͑ͳ͍ݶΓɺ
 ੵۃతʹ࢖༻͢Δ΂͖͸ͳͦ͞͏ɻ

Slide 30

Slide 30 text

ͦ΋ͦ΋ɺϝιουͷಈతݺͼग़͠ΛࣙΊ͔ͨΒ
 ߴ଎Խͨ͠ʹҧ͍ͳ͍…
 (੩తʹ͢Ε͹LLVMʹΑΔ࠷దԽͷϝϦοτ΋ड͚Εͦ͏)

Slide 31

Slide 31 text

ωλ੾Ε
 Swiftখωλू ୈೋ෦

Slide 32

Slide 32 text

Special Literals • __FILE__
 ݱࡏͷϑΝΠϧ໊ • __LINE__
 ݱࡏͷߦ਺ • __COLUMN__
 ݱࡏͷྻ਺ • __FUNCTION__
 ࣮ߦதͷؔ਺໊

Slide 33

Slide 33 text

REPLͰ΍Δͱ __FILE__ // => “" ! __FUNCTION__// => "$__lldb_expr"

Slide 34

Slide 34 text

ΧϦʔԽͱ෦෼ద༻

Slide 35

Slide 35 text

http://ja.wikipedia.org/wiki/ΧϦʔԽ “ΧϦʔԽ (currying) ͱ͸ɺܭࢉػՊֶ෼ ໺ͷٕ๏ͷҰͭɻෳ਺ͷҾ਺ΛͱΔؔ਺ ΛɺҾ਺͕ʮ΋ͱͷؔ਺ͷ࠷ॳͷҾ਺ʯ Ͱ໭Γ஋͕ʮ΋ͱͷؔ਺ͷ࢒ΓͷҾ਺Λ औΓ݁ՌΛฦؔ͢਺ʯͰ͋ΔΑ͏ͳؔ਺ ʹ͢Δ͜ͱɻ”

Slide 36

Slide 36 text

HaskellɺMLͷΑ͏ʹσϑΥϧτ ͰΧϦʔԽ͞ΕΔΘ͚Ͱ͸ͳ͍ func addTwoNumbers(a: Int, b: Int) -> Int { return a + b } ! var partial = addTwoNumbers(4) ! // ίϯύΠϧΤϥʔ

Slide 37

Slide 37 text

͜͏ॻ͚͹෦෼ద༻Ͱ͖Δʂ func addTwoNumbers(a: Int)(b: Int) -> Int { return a + b } ! var partial = addTwoNumbers(4) // => (b: Int) -> Int ! var reuslt = partial(b: 5) // => 9

Slide 38

Slide 38 text

Preprocessor Directive • in Swift you use a global constant instead.
 
 ϓϦϓϩηοαͰ͸ͳ͘ɺάϩʔόϧఆ਺Λ࢖͏ɻ • Complex macros are used in C and Objective-C but have no counterpart in Swift.
 
 ؔ਺ܗࣜͷϚΫϩʹ͋ͨΔΑ͏ͳ΋ͷ͸ଘࡏ͠ͳ ͍ɻ

Slide 39

Slide 39 text

ϝιουͷ໋໊ن໿

Slide 40

Slide 40 text

ૢ࡞ʴલஔࢺελΠϧ͸
 ౿ऻ͞ΕΔ໛༷ class myCounter { func incrementBy(amout: Int, numberOfTimes: Int) { // increment } } ! let counter = myCounter() ! // σϑΥϧτͰ͸ɺୈҰҾ਺ͷ֎෦Ҿ਺໊͸লུ͞ΕΔɻ counter.incrementBy(1, numberOfTimes:1)

Slide 41

Slide 41 text

ୈೋҾ਺Ҏ߱΋
 Ҿ਺໊Λলུ͍ͨ͠৔߹ class myCounter { // ΞϯμʔείΞͰΦʔόʔϥΠυͯ͠͠·͏ɻ func incrementBy(amout: Int, _ numberOfTimes: Int) { // increment } } ! let counter = myCounter() ! counter.incrementBy(1, 1)

Slide 42

Slide 42 text

Overflowͷѻ͍ • SwiftͷσϑΥϧτͷڍಈͰ͸Φʔόʔϑϩʔ ͨ͠৔߹Τϥʔ͕ൃੜ͢Δɻ • ΦʔόϑϩʔΛڐ༰͢Δ৔߹ɺ
 Ξϯύαϯυ(&)͔Β࢝·Δࢉज़ԋࢉࢠΛ࢖༻ ͢Δඞཁ͕͋Δɻ • &+, &-, &*, &/, &% ←͍ͭ͜Β

Slide 43

Slide 43 text

ݺͼग़͠ݩʹؼͬͯ͜ͳ͍
 ؔ਺ͷએݴ ! @noreturn func tryMe() { exit(EXIT_FAILURE) } ! // ΋ͪΖΜexitࣗମ΋@noreturn @noreturn func exit(_: CInt)

Slide 44

Slide 44 text

·ͱΊ

Slide 45

Slide 45 text

ܕਪ࿦෇͖ͷ੩తܕ෇͚ݴޠ Swift࠷ߴʂʂʂ(৸ฦΔ)

Slide 46

Slide 46 text

͋Γ͕ͱ͏͍͟͝·ͨ͠