Slide 1

Slide 1 text

What Will be changed in Swiftɹ v4.0.0.1 Daiki Matsudate / @d_date ୈ72ճ Cocoaษڧձؔ੢

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

Qiitaʹهࣄ্͛·ͨ͠

Slide 6

Slide 6 text

Agenda • ͱͯ΋60πΠʔτͰ͸πΠʔτͰ͖ͳ͔ͬͨ • Swift 4ͷมߋ఺ʹ͍͓ͭͯ࿩͠·͢

Slide 7

Slide 7 text

Agenda • Ͳ͏΍ͬͯௐ΂ͨͷ͔ʁ • Swift TweetsͷൃදͰͷగਖ਼ • Swift TweetsޙʹAccept͞ΕͨProposal

Slide 8

Slide 8 text

Ͳ͏΍ͬͯௐࠪͨ͠ͷ͔

Slide 9

Slide 9 text

Ͳ͏΍ͬͯௐࠪͨ͠ͷ͔ • Swift-evolutionͷREADMEΛಡΉ • ManifestΛಡΉ • ֤ϓϩϙʔαϧͷεςʔλεΛ֬ೝ͢Δ • ϝʔϦεΛ೷͍ͯΈΔ

Slide 10

Slide 10 text

Mediumʹهࣄ্͛·ͨ͠ • ͱͯ΋60πΠʔτͰ͸πΠʔτͰ͖ͳ͔ͬͨ • Swift 4ͷมߋ఺ʹ͍͓ͭͯ࿩͠·͢

Slide 11

Slide 11 text

v4.0.0.1 Update

Slide 12

Slide 12 text

Bug Fixed#

Slide 13

Slide 13 text

Swift 3 / 4Ϟʔυʹ͍ͭͯ ͲΜͳʹࣗ෼ͷιʔείʔυΛSwift4ରԠͯ͠΋ɺϑ ϨʔϜϫʔΫ͕Swift4ͰϏϧυ͞Ε͍ͯͳ͚Ε͹ίϯύ Πϧ͕௨Γ·ͤΜɻOSS։ൃऀͷΈͳ͞·ɺ͝ରԠΑΖ ͓͘͠ئ͍͠·͢$

Slide 14

Slide 14 text

Swift 3 / 4Ϟʔυʹ͍ͭͯ ͲΜͳʹࣗ෼ͷιʔείʔυΛSwift4ରԠͯ͠΋ɺϑ ϨʔϜϫʔΫ͕Swift4ͰϏϧυ͞Ε͍ͯͳ͚Ε͹ίϯύ Πϧ͕௨Γ·ͤΜɻOSS։ൃऀͷΈͳ͞·ɺ͝ରԠΑΖ ͓͘͠ئ͍͠·͢$

Slide 15

Slide 15 text

ҟͳΔݴޠϞʔυʹΑΔίʔυͷࠞࡏ • Ϟδϡʔϧ୯ҐͰͷόʔδϣϯࢦఆ͕Մೳɹɹɹɹ ྫ) ΞϓϦ͸Swift4, ϑϨʔϜϫʔΫ͸Swift3

Slide 16

Slide 16 text

Additional Accepted Proposals (+7 %)

Slide 17

Slide 17 text

[SE-0155] Enum Caseͷਖ਼نԽ Accepted ●มߋલ enumͷAssociated Value͸λϓϧ ●มߋޙ enumͷAssociated Valueʹ͸ɺಠࣗͷୈҰڃߏจΛ దԠ͢Δɻ

Slide 18

Slide 18 text

●ϥϕϧ͸ίϯετϥΫλ໊ͷҰ෦ Expr.elet(locals: [], body: anExpr) // ⭕, Swift 3ͷํ๏ Expr.elet(locals: body:)([], anExpr) // ⭕, Swift 4͔ΒՄೳ // f(x: y:)(0, 0)ͱಉ͡ Expr.elet(locals: body:)(locals: 0, body: 0) // ❌ enum Expr { indirect case elet(locals: [(String, Expr)], body: Expr) }

Slide 19

Slide 19 text

●ϥϕϧ͸λϓϧͷҰ෦Ͱ͸ͳ͍ enum Expr { indirect case elet(locals: [(String, Expr)], body: Expr) } let f = Expr.elet //([(String,Expr)],Expr) -> Expr f([], anExpr) // ⭕ f(locals: [], body: anExpr) // ❌ ม਺ʹ֨ೲ͢Δͱɺϥϕϧͷ৘ใ͕ফ͑Δ

Slide 20

Slide 20 text

enum SyntaxTree { case type(variables: [TypeVariable]) case type(instantiated: [Type]) } case .type // ❌: ᐆດ case .type(variables: let variables) // ⭕:ϑϧωʔϜΛࢦఆ͢Δ ● ڞ௨ͷϕʔεωʔϜΛ࢖͑Δ

Slide 21

Slide 21 text

enum Animation { case fadeIn(duration: TimeInterval = 0.3) // ⭕ } let anim = Animation.fadeIn() // ⭕ ● Associated ValueʹσϑΥϧτ஋ΛઃఆͰ͖Δ

Slide 22

Slide 22 text

enum Tree { case leaf() // (()) -> Tree } enum Tree { case leaf(Void) } ●ۭͷλϓϧ͸௚઀ࢦఆͰ͖ͳ͘ͳͬͨ ● Swift 4͔Β❌ ● ্ͱಉ͜͡ͱΛ΍Δʹ͸ɺVoidΛॻ͘

Slide 23

Slide 23 text

case .variable(name: let x) // ⭕ case .variable(x: let x) // ❌: `x`ͱ͍͏ϥϕϧ͸ͳ͍ case .lambda(parameters: let params, body: let body) // ⭕ case .lambda(params: let params, body: let body) // ❌: ୈҰҾ਺ϥϕϧ͕ؒҧ͍ͬͯΔ ●ύλʔϯͷҰ؏ੑ indirect enum Expr { case variable(name: String) case lambda(parameters: [String], body: Expr) } ϥϕϧ໊͸౷Ұ͢Δඞཁ͕͋Δ

Slide 24

Slide 24 text

case .variable(let name) // ⭕: ม਺໊͕ϥϕϧ໊ͱಉ͡ case .lambda(let parameters, let body) // ⭕: ม਺໊͕ϥϕϧ໊ͱಉ͡ case .variable(let x) // ❌: ϥϕϧͷॻ͖ํ͸1௨Γʹ౷Ұ͢Δඞཁ͕͋Δɻ case .lambda(let params, let body) // ❌: ্هͱಉ༷ case .lambda(parameters: let params, let body) // ❌ ●ύλʔϯͷҰ؏ੑ indirect enum Expr { case variable(name: String) case lambda(parameters: [String], body: Expr) } ϥϕϧ໊ͱม਺໊͕ಉҰͷ࣌ʹݶΓɺϥϕϧΛ লུՄ

Slide 25

Slide 25 text

[SE-0161] Smart KeyPaths: Better Key-Value Coding for Swift Accepted ●มߋޙ \Λ͚ͭΔ͜ͱͰɺKeyPathͱͯ͠࢖͏͜ͱ͕Ͱ͖Δ

Slide 26

Slide 26 text

[SE-0161] Smart KeyPaths: Better Key-Value Coding for Swift Accepted class Person { var name: String var friends: [Person] = [] var bestFriend: Person? = nil init(name: String) { self.name = name } } var han = Person(name: "Han Solo") var luke = Person(name: "Luke Skywalker") luke.friends.append(han)

Slide 27

Slide 27 text

[SE-0161] Smart KeyPaths: Better Key-Value Coding for Swift Accepted // create a key path and use it let firstFriendsNameKeyPath = \Person.friends[0].name let firstFriend = luke[keyPath: firstFriendsNameKeyPath] // "Han Solo" // or equivalently, with type inferred from context luke[keyPath: \.friends[0].name] // "Han Solo" // rename Luke's first friend luke[keyPath: firstFriendsNameKeyPath] = "A Disreputable Smuggler" // optional properties work too let bestFriendsNameKeyPath = \Person.bestFriend?.name let bestFriendsName = luke[keyPath: bestFriendsNameKeyPath] // nil, if he is the last Jedi \Λ͚ͭΔ͜ͱͰɺKeyPathͱͯ͠࢖͏͜ͱ͕Ͱ͖Δ

Slide 28

Slide 28 text

[SE-0163] String Revision: Collection Conformance, C Interop, Transcoding • StringΛBidirectionalCollection, RangeReplaceableCollection΁ͷద߹ • String.SubSequenceΛSubstringܕͱ͢Δ • Unicodeϓϩτίϧͷಋೖ • C interop ϝιου΁ͷ౷߹ • Transcoding Infrastructure ͷվగ ●มߋޙ Accepted

Slide 29

Slide 29 text

[SE-0164] Protocol Extensionʹ͓͚Δfinalͷআڈ Accepted ●มߋલ ●มߋޙ protocol extensionͷϝιουʹfinal͕࢖͑Δ protocol extensionͷϝιουʹfinal͕࢖͑ͳ͘ͳΔ

Slide 30

Slide 30 text

[SE-0165] DictionaryͱSetͷڧԽ Accepted

Slide 31

Slide 31 text

[SE-0165] DictionaryͱSetͷڧԽ Accepted #

Slide 32

Slide 32 text

[SE-0168] Multi-Line String Literals Accepted “””τϦϓϧΫΥʔτ”””Λ࢖͏͜ͱͰɺෳ਺ߦͷString Λ࢖͏͜ͱ͕Ͱ͖ɺ”ͷΤεέʔϓ͕ඞཁͳ͘ͳΔ assert( xml == """ \(author) XML Developer's Guide Computer 44.95 2000-10-01 An in-depth look at creating applications with XML. """ )

Slide 33

Slide 33 text

[SE-0169] privateͱextensionͷ૬ޓ࡞༻ͷվળ Accepted ●privateଐੑͰ΋ɺextensionΛ·͍ͨͰͷΞΫηε͕Մೳ struct S { private var p: Int func f() { use(g()) // ⭕:extensionʹએݴ͞Ε͍ͯΔg()ʹΞΫηεՄೳ } } extension S { private func g() { use(p) // ⭕:SͷextensionͳͷͰɺpʹΞΫηεͰ͖Δ } } extension S { func h() { use(g()) // ⭕:h()͸g()ʹΞΫηεͰ͖Δɻ } }

Slide 34

Slide 34 text

// FileA.swift struct A { private var aMember : Int } // FileB.swift extension A { private func foo() { bar() // ⭕, foo()͸bar()΁ΞΫηεͰ͖Δ } } extension A { private func bar() { aMember = 42 // ❌, private͸ϑΝΠϧΛ·͍ͨͰͷΞΫηεෆՄ } } ●privateʹ͸ϑΝΠϧΛ·͍ͨͰͷΞΫηε͸Ͱ͖ͳ͍

Slide 35

Slide 35 text

·ͱΊ • swift4΁ͷ࠷ऴϦϒϥϯν͸6/1 • ΩϟονΞοϓ͸͜·Ίʹ͠·͠ΐ͏% (ݱࡏActive ReviewͷProposal͸5ͭ)

Slide 36

Slide 36 text

Thank you$