Slide 1

Slide 1 text

What Will be changed in Swiftɹ v4.0.0(2) Daiki Matsudate / @d_date SwiftѪ޷ձ vol.18

Slide 2

Slide 2 text

ࣗݾ঺հ / Self Introduction ɾFreelance Engineer (2017/05ʙ) ɾ@d_date (Ͱ͌ʔͩͯ/Ͱ͌ʔͰ͍ͱ) ɾiOSྺ6೥ (iOS 4ʙ) ɾDaiki Matsudate ɾ6݄ʹαϯϊθʹߦ͖·͢✈

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

Qiitaʹهࣄ্͛·ͨ͠

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

Ͳ͏΍ͬͯௐࠪͨ͠ͷ͔

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

Swift Evolution"

Slide 12

Slide 12 text

apple/swift-evolution

Slide 13

Slide 13 text

apple/swift-evolution

Slide 14

Slide 14 text

Read Manifest#

Slide 15

Slide 15 text

apple/swift/docs/

Slide 16

Slide 16 text

Manifest • ABIStability Manifesto • Generics Manifesto • Ownership Manifesto • String Manifesto

Slide 17

Slide 17 text

Check Status of Proposals$

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

Swift Evolution Reviewத ঝೝࡁ ࣮૷ࡁ ϦδΣΫτ औΓԼ͛

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

v4.0.0.1-2 Update

Slide 23

Slide 23 text

Bug Fixed%

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

Additional Accepted Proposals (+11 ')

Slide 28

Slide 28 text

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

Slide 29

Slide 29 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 30

Slide 30 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 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 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 35

Slide 35 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 36

Slide 36 text

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

Slide 37

Slide 37 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 38

Slide 38 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 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

[SE-0166] Swift Archival & Serialization ●௥Ճޙ Codableܕ(Encodable & Decodableͷtypealias)ͷಋೖ

Slide 42

Slide 42 text

[SE-0167] Swift Encoders ●௥Ճޙ 1. JSON / Property ListͷDecoder/Encoderͷ௥Ճ 2. NSKeyedArchiver/NSKeyedUnarchiverʹ CodableܕΛαϙʔτ

Slide 43

Slide 43 text

CodableܕͱɺJSON Encoder/DecoderΛ૊Έ߹ΘͤΔ let farm = Farm(name: "Old MacDonald's Farm", location: Location(latitude: 51.621648, longitude: 0.269273), animals: [.chicken, .dog, .cow, .turkey, .dog, .chicken, .cow, .turkey, .dog]) let payload: Data = try JSONEncoder().encode(farm) do { let farm = try JSONDecoder().decode(Farm.self, from: payload) // Extracted as user types: let coordinates = "\(farm.location.latitude, farm.location.longitude)" } catch { // Encountered error during deserialization }

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

[SE-0169] privateͱextensionͷ૬ޓ࡞༻ͷվળ ●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 46

Slide 46 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 48

Slide 48 text

[SE-0171] Reduce with inout extension Sequence where Iterator.Element: Equatable { func uniq() -> [Iterator.Element] { return reduce(into: []) { (result: inout [Iterator.Element], element) in if result.last != element { result.append(element) } } } } ܭࢉྔ…O(n) ●௥Ճޙ

Slide 49

Slide 49 text

[SE-0171] Reduce with inout extension Sequence where Iterator.Element: Equatable { func uniq() -> [Iterator.Element] { return reduce([]) { (result: [Iterator.Element], element) in guard result.last != element else { return result } return result + [element] } } } ܭࢉྔ…O(n2) ●௥Ճલ

Slide 50

Slide 50 text

[SE-0172] One-sided Ranges ●มߋޙ let greeting = s.prefix(upTo: i) let withComma = s.prefix(through: i) let location = s.suffix(from: i) ยଆͷΈͷrange operatorΛ௥Ճ let greeting = s[..

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

Thank you&